如何在使用array_split时处理netezza中的无效索引ID错误?

时间:2016-11-23 09:50:42

标签: sql netezza

AC_NO  
1  
2  
3  
4 

表1中的数据:

COMMON_KEY  

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

表2中的数据

<script>
MktoForms2.whenReady( function(form) {
    //set the first result as local variable
    var mktoLeadFields = mktoLead.result[0];
    //map your results from REST call to the corresponding field name on the form
    var prefillFields = { 
            "Email" : mktoLeadFields.email,
            "FirstName" : mktoLeadFields.firstName,
            "LastName" : mktoLeadFields.lastName,
            "Company" : mktoLeadFields.company
            };
    //pass our prefillFields objects into the form.vals method to fill our fields
    form.vals(prefillFields);
    }
    );
</script>

以上查询错误:

  

错误[HY000]错误:0:索引ID无效

2 个答案:

答案 0 :(得分: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;

是一个偏好的问题,但我发现它更具可读性:)

答案 1 :(得分:1)

无论出于何种原因,Netezza都会评估涉及UDF的案例的THEN表达式(您正在使用的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;