Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可以在Teradata中的字符串中对字符串进行分组?_Sql_Teradata - Fatal编程技术网

Sql 是否可以在Teradata中的字符串中对字符串进行分组?

Sql 是否可以在Teradata中的字符串中对字符串进行分组?,sql,teradata,Sql,Teradata,原来的表正是我正在使用的表。。带有所有逗号括号等 id attributes 1 123(red), 139(red), 123(white), 123(black), 139(white), 2 123(black), 139(white), 123(green), 32 223(blue), 223(red), 553(white), 123(black), 4 323(white), 139(red), 23 523(red), 我

原来的表正是我正在使用的表。。带有所有逗号括号等

id     attributes
1      123(red), 139(red), 123(white), 123(black), 139(white),
2      123(black), 139(white), 123(green),
32     223(blue), 223(red), 553(white), 123(black),
4      323(white), 139(red), 
23     523(red),
我需要对属性编号进行分组,使我的表看起来像

id     attributes
1      123(red, white, black); 139(red, white);
2      123(black, green); 139(white);
32     223(blue, red); 553(white); 123(black);
4      323(white); 139(red);
23     523(red);
我该怎么做


不幸的是,我无法访问存储过程和函数,如oreplace。。翻译我以前曾与Oracle打过交道,如果可以访问存储过程,这是一项简单的任务。。。在这里,我不知道该做什么

SQL绝对不是这样处理字符串的合适语言:-

我使用现有代码拆分/创建逗号分隔的字符串,但在TD14中,使用strtok_split_to_table和udfConcat更容易

CREATE VOLATILE TABLE vt (id INT, attrib VARCHAR(100)) ON COMMIT PRESERVE ROWS;

INSERT INTO vt(1      ,'123(red), 139(red), 123(white), 123(black), 139(white),');
INSERT INTO vt(2      ,'123(black), 139(white), 123(green),');
INSERT INTO vt(32     ,'223(blue), 223(red), 553(white), 123(black),');
INSERT INTO vt(4      ,'323(white), 139(red), ');
INSERT INTO vt(23     ,'523(red),');

WITH RECURSIVE cte
 (id,
  len,
  remaining,
  word,
  pos
 ) AS (
  SELECT
    id,
    POSITION(',' IN attrib || ',') - 1 AS len,
    SUBSTRING(attrib || ',' FROM len + 2) AS remaining,
    TRIM(SUBSTRING(attrib FROM 1 FOR len)) AS word,
    1
  FROM vt
  UNION ALL
  SELECT
    id,
    POSITION(',' IN remaining)- 1 AS len_new,
    SUBSTRING(remaining FROM len_new + 2),
    TRIM(SUBSTRING(remaining FROM 1 FOR len_new)),
    pos + 1
  FROM cte
  WHERE remaining <> ''
 )
SELECT
  id,
     MAX(CASE WHEN newpos = 1 THEN newgrp ELSE '' END) ||
     MAX(CASE WHEN newpos = 2 THEN newgrp ELSE '' END) ||
     MAX(CASE WHEN newpos = 3 THEN newgrp ELSE '' END) ||
     MAX(CASE WHEN newpos = 4 THEN newgrp ELSE '' END) ||
     MAX(CASE WHEN newpos = 5 THEN newgrp ELSE '' END) ||
     MAX(CASE WHEN newpos = 6 THEN newgrp ELSE '' END)
     -- add as many CASEs as needed
FROM
 ( 
   SELECT 
     id, 
     ROW_NUMBER() 
     OVER (PARTITION BY id
           ORDER BY newgrp) AS newpos,
     a ||
     MAX(CASE WHEN pos = 1 THEN '('  || b ELSE '' END) ||
     MAX(CASE WHEN pos = 2 THEN ', ' || b ELSE '' END) ||
     MAX(CASE WHEN pos = 3 THEN ', ' || b ELSE '' END) ||
     MAX(CASE WHEN pos = 4 THEN ', ' || b ELSE '' END) ||
     MAX(CASE WHEN pos = 5 THEN ', ' || b ELSE '' END) ||
     MAX(CASE WHEN pos = 6 THEN ', ' || b ELSE '' END)
     -- add as many CASEs as needed
     || '); ' AS newgrp
   FROM 
    (
      SELECT
        id,
        ROW_NUMBER() 
        OVER (PARTITION BY id, a
              ORDER BY pos) AS pos,
        SUBSTRING(word FROM 1 FOR POSITION('(' IN word) - 1) AS a,
        TRIM(TRAILING ')' FROM SUBSTRING(word FROM POSITION('(' IN word) + 1)) AS b
      FROM cte
      WHERE word <> ''
    ) AS dt
   GROUP BY id, a
 ) AS dt
GROUP BY id;

您是否实际存储了逗号分隔列表中显示的属性?你想把它转换成另一种完全非规范化的形式吗?当然,您可以将属性拆分为一个normalize列和重新聚合,但是根据您访问属性的方式,这在客户端可能会更容易完成。谢谢。我上面的桌子是实际的桌子。该表与上面的表完全相同,带有所有逗号和分号。我如何进行转换@您使用的Teradata版本是什么?为什么不能使用存储过程?您能将结果的中间部分存储在临时表中吗?@jboi我可以创建使用等。。。易变表。只是dba限制了存储过程和函数