2017-02-14 87 views
1

我试图使用解决方案1中here的以下SQL脚本将阵列转置为单独的行。将阵列转换为Netezza中的行

当我运行它时,它只会检索数组的第一个元素。我想要显示数组的所有元素。昨天,我记得修改了这个脚本的一部分,它似乎运行正常。但是我没有保存脚本!

SELECT F.ROWID 
     , C.CNT 
     , SQLEXT..get_value_varchar(ARR,CAST(DECODE(SIGN(LEN-c.CNT),1,c.CNT,null) AS INT)) AS ELEMENT_NM 
FROM (SELECT ROWID 
       , SQLEXT..ARRAY_SPLIT(FINELINE_NM,';')  AS ARR 
       , SQLEXT..ARRAY_COUNT(SQLEXT..ARRAY_SPLIT(FINELINE_NM,';')) AS LEN 
     FROM DATABASE.DEV_LDG_REPORT   
     )             AS F 
CROSS JOIN (SELECT ROW_NUMBER() OVER (ORDER BY 1)   AS CNT 
      FROM (SELECT * 
         FROM DATABASE.DEV_LDG_REPORT 
         LIMIT 100)       AS V 
      )            AS C 
WHERE DECODE(SIGN(LEN-C.CNT),1, C.CNT, NULL) IS NOT NULL 
; 

从本质上讲,我想这样的:

ID  FINELINE_NM 
1   123;124;125 
2   123;124;125;126 

看起来像这样:

ID  FINELINE_NM 
1   123 
1   124 
1   125 
2   123 
2   124 
2   125 
2   126 

是否有在上面的脚本中,你可以看到它允许所有的任何修改要在结果中返回的元素?

+0

欢迎来到StackOverflow!作为提醒,请避免仅仅链接到包含实质性相关细节的外部来源,因为它们可能会改变或在以后被删除。可以包含链接,但可以考虑将与问题相关的任何内容包含在问题本身中。 – STLDeveloper

回答

0

据我的理解:

  • CROSS JOINC只是生成数字索引列表到阵列的位置。如果有较少的记录比DATABASE.DEV_LDG_REPORT中有一个数组项,你会不会到达终点
  • DECODE(SIGN(LEN-c.CNT),1,c.CNT,null)返回null时LEN = c.CNT(即SIGN为0),因此这将错过最后一个条目阵列。最好使用LEN+1-c.CNT里面的SIGN函数