2016-11-23 43 views
1
SELECT T1.AC_NO FROM TALE1 T1 
INNER JOIN TABLE2 T2 
ON T1.AC_NO= 
CASE 
    WHEN T2.COMMON_KEY LIKE '%~%' AND T2.COMMON_KEY IS NOT NULL 
     THEN GET_VALUE_VARCHAR(ARRAY_SPLIT(T2.COMMON_KEY,'~'),2) 
    ELSE T2.COMMON_KEY 
END 

DATA IN TABLE1:如何在使用array_split時處理netezza中的無效索引id錯誤?

AC_NO 
1 
2 
3 
4 

DATA IN TABLE2

COMMON_KEY 

A~1~EF 
B~2~CD 
3 
4 

上述查詢拋出的錯誤:

ERROR [HY000] ERROR: 0 : Invalid Index Id

+0

可否請你澄清這兩個場景以及你想要達到的目標。謝謝。 –

+0

比較兩個表的列中的值,並獲取與我的要求相匹配的數據。第二個表包含具有第一個表的相同數據的列,但附加地只有少量變量用於使數據唯一(即A〜1〜EF)。 – pyennamp

回答

1

無論出於何種原因Netezza公司評估的Then表達式涉及UDF的情況(其中SQL Extention Toolkit中的數組是來自我們的正好是)WHERE表達式是否爲真。

這裏發生的是由於這種行爲,它試圖從數組中拉第二個元素只有一個元素,當它試圖執行GET_VALUE_VARCHAR(...,2)時給你「無效索引ID」錯誤)對數組只有1個值(例如3和4),即使您認爲CASE應該永遠不需要測試它。

無論如何,通過使THEN表達式不失敗,可以制定解決方法。

SELECT T1.AC_NO 
FROM TABLE 1T1 
INNER JOIN TABLE2 T2 
ON T1.AC_NO= 
CASE 
    WHEN T2.COMMON_KEY LIKE '%~%' AND T2.COMMON_KEY IS NOT NULL 
     THEN GET_VALUE_VARCHAR(ARRAY_SPLIT(T2.COMMON_KEY,'~'),min(array_count(ARRAY_SPLIT(T2.COMMON_KEY,'~')),2)) 
    ELSE T2.COMMON_KEY 
END; 
+0

Netezza並沒有做「懶惰評估」 – Andrew

2

斯科特是這裏的東西 - 只是確保它永遠不會失敗。我的建議是,在機箱內部的字符串的結尾來連接額外的「〜」:

SELECT T1.AC_NO 
FROM TABLE 1T1 
INNER JOIN TABLE2 T2 
ON T1.AC_NO= 
CASE 
    WHEN T2.COMMON_KEY LIKE '%~%' AND T2.COMMON_KEY IS NOT NULL 
     THEN GET_VALUE_VARCHAR(ARRAY_SPLIT(T2.COMMON_KEY||'~','~'),2)) 
    ELSE T2.COMMON_KEY 
END; 

偏好的問題,但我覺得它更具可讀性:)

相關問題