字符串类型数组之间的“困难”连接

时间:2017-08-31 19:26:02

标签: sql amazon-redshift

我为这个奇怪的头衔道歉。我不完全确定这在sql-like(redshift)中是可行的,但我们可以试试。 我有两张桌子。一个(名为 asm )类似于(所有类型都是文本):

hashid                            kuids
00009fff755fb6cafbfe1d3262d0a6d4  [LDydc6kP, LBzCi_CB, LBrFy7Ot]
000bcb9ce17770ebb981e761ca71d395  [K2zw2pRu, LBbGkhWm]

和另一个名为 la 的:

kuid        lakuids
LDydc6kP    [KEqeQBJ8, KOvcq6TZ, K2zw2pRu, LQwVKtec, J6lfIKfY]
Lb7PtjUG    [JBsQJf1O, LcmasXTm, JkN5IhP4, LBbGkhWm]

1)如果 la 中的kuid至少在 asm 中的kuid的一个元素中 - >>将 as 中的 asm 中的hashid放入 la (同一行)中的新列(hashid),否则将'None'

2)创建新列lahashids,其中值是表 asm 中kuids与hashid映射的列表,未知列是kuids表中不存在的lakuids列表** asm * < / p>

我知道,它看起来很奇怪。我愿意改变类型和表结构....

预期答案应为 la

kuid        lakuids                                              hashid                             lahashids                                  unknown      
LDydc6kP    [KEqeQBJ8, KOvcq6TZ, K2zw2pRu, LQwVKtec, J6lfIKfY]   00009fff755fb6cafbfe1d3262d0a6d4   [000bcb9ce17770ebb981e761ca71d395]         [KEqeQBJ8, KOvcq6TZ, LQwVKtec, J6lfIKfY]                         
Lb7PtjUG    [JBsQJf1O, LcmasXTm, JkN5IhP4, LBbGkhWm]             None                                None                                      [JBsQJf1O, LcmasXTm, JkN5IhP4, LBbGkhWm]

1 个答案:

答案 0 :(得分:0)

您可以为数组匹配创建一个Python UDF,返回类似于此的布尔值(过去必须处理相同的问题,所以我分享):

CREATE OR REPLACE FUNCTION f_inlist(element varchar, list varchar)
RETURNS boolean
STABLE AS $$ 
if list==None:
    return False
list = list.strip('[').strip(']').split(',')
if (element in list):
    return True
else:
    return False
$$ LANGUAGE plpythonu;

所以你可以像这样使用这个函数作为连接条件:

ON f_inlist(element_column, list_column)

当然它很慢,所以最好避免这种结构并将列表拆分成多行,但如果无法避免这是一种方法