バックリファレンス値を使用して置換文字列が動的に選択されることを除いて、バニラの regexp_replace を実行しようとしています。
もう少し状況を説明するために、2 つの文字列を (簡単にするために、同じテーブルの 2 つの列で言うと) 持っています。最初のものには、文字列リテラル自体の一部として {1}、{2} などのプレースホルダーが含まれています。これは、2 番目の文字列の対応するサブフィールドに置き換える必要があります (「|」などの定数区切り文字でトークン化した後)。
したがって、次の場合:
Str1 = '素早い茶色の {1} が怠惰な {2} を飛び越える。'
Str2 = 'キツネ|犬'
私たちは結果を必要としています.
理想的な世界では、Oracle (11g Enterprise 64 ビット) でこれが可能になります。
with x as (select 'The quick brown {1} jumps over the lazy {2}.' col1, 'fox|dog' col2 from dual)
select regexp_replace(x.col1, '({[0-9]+})', regexp_substr(x.col2,'[^|]+',1,'\1')) as result
from x
ただし、2 番目の regexp_substr は、外側の regexp_replace 呼び出しからの後方参照を認識せず、ORA-17222: 無効な数値をスローします。
私のビジネスケースは、このデータを含む (おそらく実体化された) ビューを作成することであるため、ストアドプロシージャまたは関数を作成したくありません。これを行うことができるワンライナーがあればいいのにと思います。
さまざまなフォーラムを見ると、Oracleはこの後方参照の受け渡しをサポートしていない可能性があるため、質問のタイトルは少し誤解を招く可能性があります. 私はプログラミングの経験はありますが、Oracle自体は経験していないので、優しくしてください!
一部のブラウジングでは、複雑な正規表現パズルに MODEL 句や xmltables (今日まで聞いたことがない) などのあいまいなものを使用する傾向があることが示されていますが、見落としているぎこちないほど単純なものがあると思います。