Sql 如何在使用数组_split时处理netezza中的无效索引id错误?
表1中的数据:Sql 如何在使用数组_split时处理netezza中的无效索引id错误?,sql,netezza,Sql,Netezza,表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 表2中
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
表2中的数据
AC_NO
1
2
3
4
上面的查询抛出一个错误:
错误[HY000]错误:0:索引Id无效
无论出于何种原因,Netezza都会对涉及UDF(您正在使用的SQL扩展工具包中的数组函数恰好是UDF)的情况的THEN表达式求值,无论WHERE表达式是否为true 这里发生的情况是,由于这种行为,它试图从只有一个元素的数组中提取第二个元素,当它试图在只有1个值(例如3和4)的数组上执行GET_VALUE_VARCHAR(…,2)时,会出现“Invalid Index ID”错误,即使您认为该案例不需要测试它 不管怎样,都可以通过使THEN表达式不失败来解决问题
COMMON_KEY
A~1~EF
B~2~CD
3
4
斯科特在这里有所发现——只要确保它永远不会失败。我的建议是在案例中的字符串末尾连接一个额外的“~”:
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;
这是一个偏好的问题,但我觉得它更具可读性:)请您澄清这两种情况,以及您试图实现的目标。谢谢。比较两个表的列中的值并获取符合我要求的数据。第二个表包含一个与第一个表数据相同的列,但附加了一些变量以使数据唯一(即~1~EF)。Netezza没有进行“惰性评估”
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;