Sql 在Teradata 14中将分隔为单独行的列拆分

Sql 在Teradata 14中将分隔为单独行的列拆分,sql,teradata,Sql,Teradata,有谁能帮我解决这个问题吗。在表中,我现在有这样的数据 如何将具有分隔符TTBFA-TTBFB-TTBFC-TTBFD的列节点拆分为4行,其他列相同 加州地区GAXAEB 102520000 18.71 4 2014年8月30日 加利福尼亚州地区TTBFA 92160000 23.33 3 2014年9月13日 加利福尼亚州地区TTBFB 92160000 23.33 3 2014年9月13日 加利福尼亚州地区TTBFC 92160000 23.33 3 2014年9月13日 加利福尼亚州地区T

有谁能帮我解决这个问题吗。在表中,我现在有这样的数据

如何将具有分隔符TTBFA-TTBFB-TTBFC-TTBFD的列节点拆分为4行,其他列相同

加州地区GAXAEB 102520000 18.71 4 2014年8月30日

加利福尼亚州地区TTBFA 92160000 23.33 3 2014年9月13日

加利福尼亚州地区TTBFB 92160000 23.33 3 2014年9月13日

加利福尼亚州地区TTBFC 92160000 23.33 3 2014年9月13日

加利福尼亚州地区TTBFD 92160000 23.33 3 2014年9月13日

列节点的值并不总是5个字符,它可能如下所示

提前感谢

您可以使用(无论最大节点数是多少)
将所有
语句和
子字符串
与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
    ... 
这很好用

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

INSTR函数通常表示您正在运行TD14+

还有STRTOK函数,最好使用它而不是子字符串(INSTR)

您还可以交叉连接到带有数字的表,而不是最多15个并集:

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 

希望这是用于数据清理,而不是日常使用…

Hi Beth列节点并不总是5个字符,这只是一个示例。它可以根据列的不同而变化。仪表板厚度表是否相同?就像AA-BBB-CCCC-ddddd一样,dash是所有数据的分隔符。我认为您需要Instr,仍然有多个联合。您知道节点列中的最大节点数吗?嗨,Beth,这是一个varchar(500)字段。带分隔符的列中最多有15个节点。这应该是可以接受的答案!谢谢你,诺思!
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