2017-02-03 21 views
0

有一个表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)使用上面的表通过splititng all';'分离式COL7到不同的行与各COL3

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 

我可以做splititng一部分,用于计数加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, ';', '","') 
     || '"')) 
; 

可有人请建议计数下?

+0

(由COL1,COL2,COL3,COL4分区)尝试'COUNT(*)在' – krokodilko

+0

它的工作!感谢Krokodilko – Mishti

回答

0

看起来您添加的数字是通过拆分创建的行数,比COL7中的字符串中的分号(;)多一个。

这可以用1 + regexp_count(COL7, ';')来完成,这很容易编写和理解。

旧的计时器会告诉你,标准字符串函数(而不是正则表达式)通常要快得多。如果表现不理想,这一点很重要。

在这种情况下,计数可以通过

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

即获得:更换每;用“一无所有”,在COL7,看串了多少越短,会告诉你有多少;有在字符串中。在replace()额外'z'是必要的,因为replace()回报null如果任何参数(包括最后一个)是null。甲骨文的五千种怪异之一......正如所写的,函数将用z和每一个来替换每个z的出现;与“无”,所以这就是我们想要的。