Разделить колонку, которая разделена на отдельные строки в Teradata 14

Может ли кто-нибудь помочь мне в решении этого. В таблице у меня есть данные, подобные этому прямо сейчас.

введите описание изображения здесь

Как я разделяю узлы столбцов с разделителем TTBFA-TTBFB-TTBFC-TTBFD на 4 строки с другими столбцами.

Калифорнийский регион GAXAEB 102,520,000 18,71 4 8/30/2014

регион Калифорнии TTBFA 92,160,000 23,33 3 9/13/2014

Калифорнийский регион TTBFB 92,160,000 23,33 3 9/13/2014

Калифорнийский регион TTBFC 92,160,000 23,33 3 9/13/2014

Калифорнийский регион TTBFD 92,160,000 23,33 3 9/13/2014

Значение для столбцов NODES не всегда равно 5 символам, оно может варьироваться, как показано ниже

введите описание изображения здесь

заранее спасибо

вы можете использовать (любое число – ваше максимальное количество узлов). Операторы UNION ALL и SUBSTRING с INSTR для возможных местоположений для узла

попробуйте что-то вроде:

  SELECT region_name, nodes AS node, sgspeed, sgutil, portCount, WeekendingDate FROM t WHERE instr(nodes,'-') = 0 UNION ALL SELECT region_name, SUBSTRING(nodes FROM instr(nodes,'-',1,1) +1 FOR instr(nodes,'-',1,2)-1) AS node, sgspeed, sgutil, portCount, WeekendingDate FROM t WHERE instr(nodes,'-') > 0 UNION ALL SELECT region_name, SUBSTRING(nodes FROM instr(nodes,'-',1,2) +1 FOR instr(nodes,'-',1,3)-1) AS node, sgspeed, sgutil, portCount, WeekendingDate FROM t WHERE instr(nodes,'-',1,2) > 0 UNION ALL SELECT region_name, SUBSTRING(nodes FROM instr(nodes,'-',1,3) +1 FOR instr(nodes,'-',1,4)-1) AS node, sgspeed, sgutil, portCount, WeekendingDate FROM t WHERE instr(nodes,'-',1,3) > 0 ... 

Функция INSTR обычно подразумевает, что вы используете TD14 +.

Также есть функция STRTOK, лучше использовать это вместо SUBSTRING (INSTR).

И вместо 15 UNION ALLs вы также можете перекрестно присоединиться к таблице с цифрами:

 SELECT region_name, STRTOK(nodes, '-', i) AS x FROM table CROSS JOIN ( -- better don't use sys_calendar.CALENDAR as there are no statistics on day_of_calendar SELECT day_of_calendar AS i FROM sys_calendar.CALENDAR WHERE i <= 15 ) AS dt WHERE x IS NOT NULL 

И вы также можете использовать STRTOK_SPLIT_TO_TABLE в TD14:

 SELECT * FROM table AS t1 JOIN ( SELECT * FROM TABLE (STRTOK_SPLIT_TO_TABLE(table.division, table.nodes, '-') RETURNS (division VARCHAR(30) CHARACTER SET UNICODE ,tokennum INTEGER ,token VARCHAR(30) CHARACTER SET UNICODE) ) AS dt ) AS t2 ON t1.division = t2.division 

Надеюсь, это для очистки данных, а не для ежедневного использования …

Это работает нормально.

 select REGION_NAME, case when POSITION('-' IN Nodes) = 0 then NODES else SUBSTRING(Nodes,0,POSITION('-' IN Nodes)) end as node, SgSpeed, SgUtil, PortCount, WeekEndingDate FROM table UNION select REGION_NAME, SUBSTRING(nodes FROM instr(nodes,'-',1,1)+1 for instr(nodes,'-',1,1)-1) AS node, SgSpeed, SgUtil, PortCount, WeekEndingDate FROM table WHERE instr(nodes,'-') > 0 UNION select REGION_NAME, SUBSTRING(nodes FROM instr(nodes,'-',1,2)+1 for instr(nodes,'-',1,1)-1) AS node, SgSpeed, SgUtil, PortCount, WeekEndingDate FROM table WHERE instr(nodes,'-') > 0 UNION select REGION_NAME, SUBSTRING(nodes FROM instr(nodes,'-',1,3)+1 for instr(nodes,'-',1,1)-1) AS node, SgSpeed, SgUtil, PortCount, WeekEndingDate FROM table WHERE instr(nodes,'-') > 0