【问题标题】:How to group sub strings in Teradata?如何在 Teradata 中对子字符串进行分组?
【发布时间】:2014-04-12 17:56:31
【问题描述】:

我在 Teradata 14 中有下表,但是我不能自己编写过程和函数

id  property
1   1234X (Yel), 2345Y (Red), 1234X (Gre),
2   2222Y (Pin), 2222Y (Red), 2222Y (Gre),
3   3454E (Yel), 4565Y (Whi), 3454E (Red),

所有行都采用相同的方式。例如。第 1 行:1234X 是具有属性 (Yel)(Gre) 的对象。而2345YRed


如何对上表进行分组,以便每个对象的所有属性都列在一个括号中

id  property
1   1234X (Yel Gre), 2345Y (Red), 
2   2222Y (Pin Red Gre ),
3   3454E (Yel Red), 4565Y (Whi), 

【问题讨论】:

    标签: teradata


    【解决方案1】:
    WITH chunk(id,property,a,b,c,combined) AS
    (SEL id,
     property,
     STRTOK(property, ',', 1) AS a,
     STRTOK(property, ',', 2) AS b,
     STRTOK(property, ',', 3) AS c,
    CASE WHEN SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(b),1,5) AND SUBSTRING(TRIM(a),1,5) <>SUBSTRING(TRIM(c),1,5)
                THEN SUBSTRING(TRIM(a),1,10) || ' ' || SUBSTRING(TRIM(b),8,3)||')'||','||c||','
          WHEN  SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(c),1,5) AND SUBSTRING(TRIM(a),1,5)<>SUBSTRING(TRIM(b),1,5)
                THEN SUBSTRING(TRIM(a),1,10) || ' ' || SUBSTRING(TRIM(c),8,3)||')'  ||','||TRIM(b)||','  
          WHEN  SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(b),1,5) AND    SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(c),1,5)  
            THEN    SUBSTRING(TRIM(a),1,10) || ' ' || SUBSTRING(TRIM(b),8,3)||'  '||SUBSTRING(TRIM(c),8,4)||','                               
          ELSE 'Condition failed'
     END AS combined                            
     FROM Table2)
    SELECT id,combined FROM chunk 
    ORDER BY id  ;
    

    输出#

        id  combined
        1   1234X (Yel Gre),2345Y (Red),
        2   2222Y (Pin Red Gre),
        3   3454E (Yel Red),4565Y (Whi),
    

    动态方式: Is it possible to group string within a string in Teradata?

    修改#

    SEL id
      , property
      , SUBSTRING (property FROM 1 FOR INSTR(property, ',', 1, 1)-1 ) AS a
      , SUBSTRING (property FROM INSTR(property, ',', 1, 1)+1 FOR INSTR(property, ',', 1, 2) -INSTR(property, ',', 1, 1)-1 ) AS b
      , SUBSTRING (property FROM INSTR(property, ',', 1, 2)+1 FOR INSTR(property, ',', 1, 3) -INSTR(property, ',', 1, 2)-1 ) AS c 
      ,CASE 
          WHEN SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(b),1,5) AND SUBSTRING(TRIM(a),1,5)<>SUBSTRING(TRIM(c),1,5) 
             THEN SUBSTRING(TRIM(a),1,10) || ' ' || SUBSTRING(TRIM(b),8,3)||')'||','||c||',' 
          WHEN SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(c),1,5) AND SUBSTRING(TRIM(a),1,5)<>SUBSTRING(TRIM(b),1,5) 
             THEN SUBSTRING(TRIM(a),1,10) || ' ' || SUBSTRING(TRIM(c),8,3)||')' ||','||TRIM(b)||','
          WHEN SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(b),1,5) AND SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(c),1,5)
             THEN SUBSTRING(TRIM(a),1,10) || ' ' || SUBSTRING(TRIM(b),8,3)||' '||SUBSTRING(TRIM(c),8,4)||','
          ELSE 'Condition failed' 
       END AS combined
    FROM table2 ;
    

    【讨论】:

    • 谢谢。它有一个语法错误:expecting something between ')' and '','
    • @Buras 对我来说它正在运行 那么,您在哪一行遇到错误?可能你需要格式查询吗?或者您可能需要选择整个查询进行复制并且您有 STRTOK 功能吗?
    • 我照原样复制粘贴。错误在这里:CASE WHEN SUBSTRING(TRIM(a),1,5)=
    • @Buras 我在修改部分发布了新查询,试试看,让我知道。我的是14.10版本
    • 我找出问题所在。显然我不得不使用 substr 而不是 substring 。我不知道为什么,但是当我使用 substr 时它可以工作
    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多