Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在使用数组_split时处理netezza中的无效索引id错误?_Sql_Netezza - Fatal编程技术网

Sql 如何在使用数组_split时处理netezza中的无效索引id错误?

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中

表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中的数据

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;