2017-08-31 26 views
0

我對這個奇怪的標題表示歉意。我不完全確定這在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)如果kuid在LA至少在kuid的一個元素中asm - >將hashid從asm in la into a new column(hashid)in LA(同一行),否則把「無」

2)創建新的列lahashids其中值是相對於kuids映射hashid在表ASM和未知列的列表中不存在lakuids列表在kuids表** asm *

我知道,它看起來很奇怪。我很開放的變化類型和表結構....

預期的答案應該是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

如果是像TSQL什麼/ MySQL的然後你應該使用hashid => kuid和另一個到kuid => lakuid之間的許多關係之間的一對多關係。這將簡化您的加入。 – Tom

+0

請** **編輯**您的問題並根據您的樣本添加預期的輸出。 –

+0

看看我編輯的例子, – user3620915

回答

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)

當然

它的速度慢,所以最好避免這樣的結構,解開列表爲多行,但如果無法避免它,這是很長的路要走

+0

謝謝Alex。我會試試這個。目前的表格是4.5M,我想避免解包。 – user3620915