Sql 需要分裂;将数据分成不同的行,然后获取每行的计数

Sql 需要分裂;将数据分成不同的行,然后获取每行的计数,sql,oracle,oracle11g,count,Sql,Oracle,Oracle11g,Count,表TABLE01包含以下字段和值: COL1 COL2 COL3 COL4 COL5 COL6 COL7 01-01-2017 P 123 abc Y T A1_A2 01-21-2017 P 456 rst N P A1_A3;A4 06-10-2017 P 876 hyi N S A2_A8;A5_A6;A9 10-12-2017

表TABLE01包含以下字段和值:

COL1         COL2  COL3  COL4   COL5   COL6   COL7
01-01-2017   P     123   abc    Y       T     A1_A2
01-21-2017   P     456   rst    N       P     A1_A3;A4
06-10-2017   P     876   hyi    N       S     A2_A8;A5_A6;A9
10-12-2017   P     999   iop    Y       R     A7
现在我需要通过拆分所有“;”来创建一个包含列(COL1、COL2、COL3、COL4、COL7和COUNT_COL3)的新表使用每个COL3的计数将COL7分为不同的行,如下所示

COL1         COL2  COL3  COL4   COL7     COUNT_COL3
01-01-2017   P     123   abc    A1_A2      1
01-21-2017   P     456   rst    A1_A3      2
01-21-2017   P     456   rst    A4         2
06-10-2017   P     876   hyi    A2_A8      3
06-10-2017   P     876   hyi    A5_A6      3
06-10-2017   P     876   hyi    A9         3
10-12-2017   P     999   iop    A7         1
我可以做拆分部分并为计数添加0,因为不确定如何添加计数部分

INSERT into TABLE02 (COL1, COL2,COL3,COL4,COL7,COUNT_COL3)
SELECT COL1, COL2, COL3,COL4,
          trim(COLUMN_VALUE) COL7, 0
FROM TABLE01
      xmltable(('"'
      || REPLACE(COL7, ';', '","')
      || '"'))
;

有人可以建议吗?

您添加的数字似乎是通过拆分创建的行数,比COL7中字符串中的分号(
)多一个

这可以通过
1+regexp_count(COL7,;”)
完成,这很容易编写和理解

老前辈会告诉你,标准字符串函数(相对于正则表达式)通常要快得多。只有当性能不令人满意时,这才重要

在这种情况下,可通过以下方式获得计数:

1 + length(COL7) - length(replace(COL7, 'z;', 'z'))

即:更换每个
COL7
中使用“nothing”并查看字符串变短了多少,这将告诉您有多少
字符串中有个字符。
replace()
中需要额外的
'z'
,因为
replace()
在任何参数(包括最后一个)为
null时返回
null
。神谕的五千个奇事之一。。。如前所述,函数将用z替换每次出现的z,并且每个;使用“nothing”,所以这正是我们想要的。

尝试使用
count(*)覆盖(按col1、col2、col3、col4划分)
成功了!谢谢Krokodilko