我为这个奇怪的头衔道歉。我不完全确定这在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]
答案 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)
当然它很慢,所以最好避免这种结构并将列表拆分成多行,但如果无法避免这是一种方法