2016-04-12 6 views
0

私はPLSQLコードを持っています。30行のテーブルからデータを取り出します。そのうちの10カラムは長さ3の区切り文字です。これらの10カラムのフィールド数に基づいて1行を複数の行に変換する必要があります。デリミタの長さで値を分割する3 '|||'

私はすべてのデータを1つの一時テーブルにロードしています。一時テーブルでは、データを分割して複数の行をメインテーブルに挿入するカーソルを呼び出しています。

カーソルの内側regexp_substrを使用して値を分割し、私が使用する正規表現は[^\\|]+{3}です。分割後に実際の値が得られません。テストケースのために使用さ

サンプル・データは、私が

100, 200||300 , 400 , |0 

以下のような値を取得する必要があります分割した後

100|||200||300|||400||||0 

あるしかし、私は取得していますが

100 , 200, 300 ,400, 0 

でいずれもお勧めできます私はそれを行う適切な方法ですか?

返信待ち! ありがとう

+0

あなたは100が必要です|| 20 ||| 300 ||| 400〜 100-1行 200-2行 300-3行? –

+0

宣言 カーソルcdrはselect * from TEMP_TABLEです。 は0..regexp_countに私のために、CDRループ に(b_new.CHARGE、 '[〜]')MAIN_TABLEにループ 挿入(COL1、COL2、COL3等...) 値(REGEXP_SUBSTR(b_newをb_newため を開始します。 1、i)、 '0')、b_new.col2、regexp_substr(b_new.col3、 '[^〜] +'、1、i)など); エンドループ。 エンドループ。 end; 上記のコードは、デリミタの長さ= 1でうまく動作します。デリミタとして? –

+0

3列のサンプルテーブル A B C 1 2 || 2 3。 出力が必要です 1 2 3 - 行1と 1 2 3 - 行2 –

答えて

2

これを試してください。それが役に立てば幸い。

SELECT REPLACE('100|||200||300|||400||||0','|||',',') OUTPUT FROM DUAL; 

----------------------------OUTPUT--------------------------------------------- 

OUTPUT 

100,200||300,400,|0 
----------------------------------------------------------------------------- 
1

正規表現(\|*\d.*?)\|{3}|(\|*\d$)あなたはhere後にしているものをキャプチャします。

+0

うん、正規表現は、私のために働いた上記の例では、行全体になり、私の分割さの文字列では –

+0

:-)どうもありがとうまた、私は3つのパイプライン SQL>を選択しREGEXP_SUBSTR( '100を取得しています||| 200 || 300 ||| 400 |||| 0 '、'(\ | * \ d。*?)\ | {3} |(\ | * \ d $) '、1,3)dualから; REGEXP ------ 400 ||| 私は正規表現を初めて使っています.Plsは好意的です –

+0

regexp_substr( '100 ||| 200 || 300 ||| 400 |||| 0'、 '(\ | * \ d。*?)\ | { 3} |(\ | * \ d $) '、1,3、null、1) – Mottor

関連する問題