2017-02-14 2 views
1

Я пытаюсь использовать следующий SQL-скрипт, адаптированный из here в решении 1, для переноса массивов в отдельные строки.Переместить массив в строки в 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

Насколько я понимаю:

  • Таблица C в CROSS JOIN только для создания списка номеров для индекса в позиции массива. Если количество записей в DATABASE.DEV_LDG_REPORT, чем есть записи в массиве, вы не достигнете конца
  • также, DECODE(SIGN(LEN-c.CNT),1,c.CNT,null) возвращает нулевое значение, когда LEN = c.CNT (т.е. SIGN 0), так что это будет не хватать последнюю запись в массив. Лучше использовать LEN+1-c.CNT внутри функции SIGN
Смежные вопросы