2017-02-14 74 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函數