Oracle SQL,需要根据另一列的regexp计数重复一个数字序列

Oracle SQL,需要根据另一列的regexp计数重复一个数字序列,sql,regex,oracle,split,Sql,Regex,Oracle,Split,我在名为component_id的列中有csv数据,格式为800230601563126315700255800170, 使用逗号的计数,我需要在另一个名为component_instance_id的列中为component_id生成一个唯一的序列。 e、 g.1,2,3,4,5,6 您可以使用: REGEXP_COUNT:计算逗号出现的次数 REGEXP_SUBSTR:将分隔字符串拆分为行 连接方式:用于行生成 listag:用于字符串聚合 看 比如说, SQL> WITH t_1 AS

我在名为component_id的列中有csv数据,格式为800230601563126315700255800170, 使用逗号的计数,我需要在另一个名为component_instance_id的列中为component_id生成一个唯一的序列。 e、 g.1,2,3,4,5,6

您可以使用:

REGEXP_COUNT:计算逗号出现的次数 REGEXP_SUBSTR:将分隔字符串拆分为行 连接方式:用于行生成 listag:用于字符串聚合 看

比如说,

SQL> WITH t_1 AS
  2    ( SELECT '800230,6015,6312,6315,700255,800170' component_id FROM dual
  3    UNION ALL
  4    SELECT '800230,6015,6312,6315,700255,800170' FROM dual
  5    UNION ALL
  6    SELECT '800230,6015,6312,6315' FROM dual
  7    ),
  8    t AS
  9    ( SELECT ROWNUM ID, component_id FROM t_1
 10    )
 11  SELECT listagg(text, ',') WITHIN GROUP(
 12  ORDER BY cv) component_id,
 13    listagg(rn, ',') WITHIN GROUP(
 14  ORDER BY cv) component_instance_id
 15  FROM
 16    (SELECT id, lines.column_value cv,
 17      rownum rn,
 18      trim(regexp_substr(component_id, '[^,]+', 1, lines.column_value)) text
 19  FROM t,
 20    TABLE (CAST (MULTISET
 21    (SELECT LEVEL FROM dual CONNECT BY LEVEL <= regexp_count(component_id, ',')+1
 22    ) AS sys.odciNumberList ) ) lines
 23    ORDER BY id
 24    )
 25  GROUP BY id
 26  /

COMPONENT_ID                        COMPONENT_INSTANCE_ID
----------------------------------- ------------------------------------------------
800230,6015,6312,6315,700255,800170 1,2,3,4,5,6
800230,6015,6312,6315,700255,800170 7,8,9,10,11,12
800230,6015,6312,6315               13,14,15,16

SQL>
注意:WITH子句仅用于构建示例数据进行演示。您只需根据需要使用查询并重命名表名。

您可以使用:

REGEXP_COUNT:计算逗号出现的次数 REGEXP_SUBSTR:将分隔字符串拆分为行 连接方式:用于行生成 listag:用于字符串聚合 看

比如说,

SQL> WITH t_1 AS
  2    ( SELECT '800230,6015,6312,6315,700255,800170' component_id FROM dual
  3    UNION ALL
  4    SELECT '800230,6015,6312,6315,700255,800170' FROM dual
  5    UNION ALL
  6    SELECT '800230,6015,6312,6315' FROM dual
  7    ),
  8    t AS
  9    ( SELECT ROWNUM ID, component_id FROM t_1
 10    )
 11  SELECT listagg(text, ',') WITHIN GROUP(
 12  ORDER BY cv) component_id,
 13    listagg(rn, ',') WITHIN GROUP(
 14  ORDER BY cv) component_instance_id
 15  FROM
 16    (SELECT id, lines.column_value cv,
 17      rownum rn,
 18      trim(regexp_substr(component_id, '[^,]+', 1, lines.column_value)) text
 19  FROM t,
 20    TABLE (CAST (MULTISET
 21    (SELECT LEVEL FROM dual CONNECT BY LEVEL <= regexp_count(component_id, ',')+1
 22    ) AS sys.odciNumberList ) ) lines
 23    ORDER BY id
 24    )
 25  GROUP BY id
 26  /

COMPONENT_ID                        COMPONENT_INSTANCE_ID
----------------------------------- ------------------------------------------------
800230,6015,6312,6315,700255,800170 1,2,3,4,5,6
800230,6015,6312,6315,700255,800170 7,8,9,10,11,12
800230,6015,6312,6315               13,14,15,16

SQL>

注意:WITH子句仅用于构建示例数据进行演示。您只需根据需要使用查询并重命名表名。

让社区知道您尝试了什么。展示您的努力,然后询问您的困难所在。在样本输出的第一、第二和第三条记录中,值800230分别显示为组件1、7和13的是什么?Hi Tim组件id由多个客户共享,其中,我尝试生成的组件实例id序列对于每个客户和组件id组合都是唯一的。让社区知道您尝试了什么。展示您的努力,然后询问您的困难所在。在样本输出的第一、第二和第三条记录中,值800230分别显示为组件1、7和13的是什么?Hi Tim组件id由多个客户共享,其中,我尝试生成的组件实例id序列对于每个客户和组件id组合都是唯一的。您好,感谢您的回复,表中还有其他列,其中包含component_id列。您是否可以建议如何在select语句中添加这些列。@VikasSrivastava您尚未发布create和insert语句。你还没有展示你尝试过的东西。我已经为您构建了一个测试用例,并给出了一个完整的工作解决方案。我使用了精确的列名,您将其推断到其他列有多困难?您应该将其标记为已回答,并尝试其他列。@VikasSrivastava请通读以了解此网站的工作原理。如果你觉得答案有帮助,就投票吧。如果它回答了您的问题,请将其标记为已回答。库马尔,非常感谢,我将尝试自己解决它。@VikasSrivastava如果您被卡住,请回来。编辑您的问题并显示您的困难所在,以进一步帮助您。祝你一切顺利!您好,谢谢您的回复,表中还有其他列包含component_id列。您还可以建议如何在select语句中添加这些列。@VikasSrivastava您还没有发布create和insert语句。你还没有展示你尝试过的东西。我已经为您构建了一个测试用例,并给出了一个完整的工作解决方案。我使用了精确的列名,您将其推断到其他列有多困难?您应该将其标记为已回答,并尝试其他列。@VikasSrivastava请通读以了解此网站的工作原理。如果你觉得答案有帮助,就投票吧。如果它回答了您的问题,请将其标记为已回答。库马尔,非常感谢,我将尝试自己解决它。@VikasSrivastava如果您被卡住,请回来。编辑您的问题并显示您的困难所在,以进一步帮助您。祝你一切顺利!