【问题标题】:Split The Column which is delimited into separate Rows in Teradata 14拆分在 Teradata 14 中分隔为单独行的列
【发布时间】:2014-11-21 15:24:08
【问题描述】:

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

如何将具有分隔符 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 个字符,可能会有所不同,如下所示

提前致谢

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    函数 INSTR 通常意味着您正在运行 TD14+。

    还有STRTOK函数,最好用这个代替SUBSTRING(INSTR)。

    除了最多 15 个 UNION ALL,您还可以交叉连接到带有数字的表:

    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 
    

    您也可以在 TD14 中使用 STRTOK_SPLIT_TO_TABLE:

    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
    

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

    【讨论】:

    • 这应该是公认的答案!谢谢你!
    【解决方案2】:

    您可以使用(无论数量是您的最大节点数)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
        ... 
    

    【讨论】:

    • 嗨 Beth 列节点并不总是 5 个字符,这只是一个示例。它可能因列而异。
    • 虚线分隔符是一样的吗?比如AA-BBB-CCCC-DDDDD
    • 是的,破折号是所有数据的分隔符。
    • 我认为您需要 Instr,但仍需要使用多个 UNION。你知道nodes列的最大节点数吗?
    • 嗨 Beth ,这是一个 varchar(500) 字段。最多可以看到一列中有 15 个节点,带有分隔符。
    【解决方案3】:

    这工作正常。

    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
    

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 1970-01-01
      相关资源
      最近更新 更多