2016-06-14 18 views
0

すばやくチェックしてください。すべての出現を1つのselect文で置き換えることは可能ですか?もしそうでなければ、この置換を行う関数を書くつもりです。Oracle:複数の文字列の置換を置き換えます。

サンプル列

select '#col1:[email protected], #col2:[email protected], #col3:[email protected], #col4:[email protected], #col5:[email protected]' str from dual 

の予想される出力

str 
--- 
col1 val1, col2 val2, col3 val3, col4 val4, col5 val5 

コードを、これまで

with test_table as 
(Select '#col1:[email protected], #col2:[email protected], #col3:[email protected], #col4:[email protected], #col5:[email protected]' str from dual) 

    select level "occurrence", REGEXP_substr(str, '#(.*?):', 1, level, 'in', 1) "column", REGEXP_substr(str, ':(.*?)@', 1, level, 'in', 1) "value" 
    from test_table 
    CONNECT BY REGEXP_COUNT(str, '#.+?:[email protected]') >= level 

追加詳細

  1. 文字列パターンは事前に固定されています。
  2. 与えられたパターンの出現は動的であり、[column:value]のペアをいくつでも持つことができます - 実際には[table column:alias]が設定されています。
  3. 私は簡単にするためにサンプル文字列をトリムしましたが、追加の詳細(テーブルジョイン、where節など)が含まれているため、すべてのオカレンスを置き換える必要があります。これは実際にはselectステートメントです。

答えて

0

私の試み:

with test_table as 
(Select '#col1:[email protected], #col2:[email protected], #col3:[email protected],  #col4:[email protected], #col5:[email protected]' str 
from dual) 

select regexp_replace(regexp_replace(str, '[#@]', ''), '[ :]+', ' ') rez 
from test_table 
; 

インナーREGEXP_REPLACEが置き換えられます#と@は何もない(空の文字列)で、外側の正規表現は:とスペースを1つのスペースで置き換えます。

関連する問題