Sql 需要分裂;将数据分成不同的行,然后获取每行的计数
表TABLE01包含以下字段和值: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
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