2017-02-03 3 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部分を行い、カウントに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, ';', '","') 
     || '"')) 
; 

誰かがplsはお勧めできます追加する方法を追加することができ、各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 

の数と下のように別の行に区切らCOL7?

+0

'count(*)over(partition by col1、col2、col3、col4)'を試してください。 – krokodilko

+0

これは機能しました!ありがとうKrokodilko – Mishti

答えて

0

あなたが追加する数字は、分割によって作成された行の数です(COL7の文字列のセミコロン(;)の数よりも1つ多い)。

これは、書き込みが容易で理解しやすい1 + regexp_count(COL7, ';')で行うことができます。

古いタイマーは、(正規表現ではなく)標準文字列関数がしばしばはるかに高速であることを伝えます。これは、パフォーマンスが満足できるものでない場合にのみ重要です。どのように多くの;そこを教えてくれますCOL7に「何もない」とすべての;を交換し、文字列になるどのくらいの短い参照、この場合には、カウントがあること

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

することによって得ることができる

文字列の中にあった。任意の引数(最後のものを含む)がnullの場合、replace()nullを返すので、の余分な'z'が必要です。 Oracleの5千の奇妙なものの1つ...書かれているように、関数はzのすべての出現をzおよびすべてのものに置き換えます。 「何もない」という意味で、私たちが欲しいものです。

関連する問題