2017-08-24 8 views
1

(オラクルSQL)私は、このような文字列を持っている別のregexp_replaceに基づいてregexp_replaceする方法は?テーブルで

TEXT          | PARAMS 
random text [[aaa]], random text [[n]]*n | aaa=1,bbb=7,n=n*n 

私は 'PARAMS' と 'テキスト' からすべての[[]]置き換えることはできますか?誰もが私はPLSQLせずにそれを行う方法を説明することができ

select regexp_replace('[[aaa]]', '[[.*]]', regexp_substr('aaa=1', '\1')) from dual; 

:それが可能だ場合 私はそれのようになると思いますか?

+1

はい、しかしどのように置き換えるネストされたどのように多くを知ることができます作ることができますか?おそらくできません。しかし、Javaやこれに類するツールでこれを行うのはかなり簡単です。私はむしろ、データベースの外部でこの種のデータスクラブを行うでしょう。 –

+0

@TimBiegeleisenはいネストされた置換えの数は分かりませんので、ここでどのように行うのか尋ねました。うん、私はPHP/java/pythonでそれを行う方法を1001知っているが、この場合私は唯一のSQLを使用する必要があります。それは私の選択ではありません:) – newSqlz

+0

あなたは答え+1を得るのを助けるためにUpvoted。 –

答えて

0

REPLACESUBSTRINSTR関数を使用します。正規表現を使用する場合は、正規表現で特別な意味を持つ置換パラメータの文字をエスケープする必要があります。

サンプルデータ

CREATE TABLE inputs (text, params) AS 
    SELECT 'random text [[aaa]], random text [[n]]*n', 'aaa=1,bbb=7,n=n*n' FROM DUAL; 

クエリ

WITH replacement (text, params, idx) AS (
    SELECT REPLACE(
      text, 
      '[[' || SUBSTR(params, 1, INSTR(params, '=', 1) - 1) || ']]', 
      CASE INSTR(params, ',', 1) 
      WHEN 0 
      THEN SUBSTR(params, INSTR(params, '=', 1) + 1) 
      ELSE SUBSTR(params, INSTR(params, '=', 1) + 1, INSTR(params, ',', 1) - INSTR(params, '=', 1) - 1) 
      END 
     ), 
     params, 
     INSTR(params, ',', 1) + 1 
    FROM inputs 
UNION ALL 
    SELECT REPLACE(
      text, 
      '[[' || SUBSTR(params, idx, INSTR(params, '=', idx) - idx) || ']]', 
      CASE INSTR(params, ',', idx) 
      WHEN 0 
      THEN SUBSTR(params, INSTR(params, '=', idx) + 1) 
      ELSE SUBSTR(params, INSTR(params, '=', idx) + 1, INSTR(params, ',', idx) - INSTR(params, '=', idx) - 1) 
      END 
     ), 
     params, 
     INSTR(params, ',', idx) + 1 
    FROM replacement 
    WHERE idx > 1 
) 
SELECT text 
FROM replacement 
WHERE idx = 1; 

出力

TEXT 
-------------------------------- 
random text 1, random text n*n*n 
+0

偉大なthnx! :-) – newSqlz

+0

、私は別の同様のケースがあるが、別のテーブルのparams:CREATE TABLEの入力(テキスト)AS SELECT 'ランダムなテキスト<< >> blablabla << >>' FROM DUAL; SELECT 'AAA'、DUAL 組合から 'QQQ' AS TABLE paramsは(名前、値)を作成し、すべての SELECT 'BBB'、DUAL から 'WWW'; ///それはこの場合にどのようになるかを示すことができますか? – newSqlz

+0

@newSqlzあなたは、新しい質問として答えが1つの答えの混乱を作成するためにこれとは十分に異なっていると思うほうがよいでしょう。 – MT0

関連する問題