おそらく最も効率的ではありませんが、再帰的に機能します(つまり、crit_description
の場合) それ自体に「プレースホルダー」が含まれ、それらも展開されます。 (以下に示すものよりも単純な最初の解決策では、この再帰的な手順は実行されませんでした。)追加した3番目のサンプル入力を参照してください。もう少しクリーンアップできたら、後でまた投稿します。
注:これは、すべての「プレースホルダー」が実際にcriteria_info
にあることを前提としています。 テーブル;それらが見つからない場合に何が起こるかをテストしませんでした。要件を述べるOP。
with
inputs ( criteria ) as (
select '$1 = True' from dual union all
select '$2 > $3' from dual union all
select '$1 = $4' from dual
),
criteria_info ( crit_id, crit_description ) as (
select 1, 'Example 1' from dual union all
select 2, 'Example 2' from dual union all
select 3, 'Example 3' from dual union all
select 4, '$2 + $3' from dual
),
rec ( criteria, new_str ) as (
select criteria, criteria
from inputs
union all
select r.criteria,
regexp_replace(r.new_str, '\$\d+', c.crit_description, 1, 1)
from rec r inner join criteria_info c
on to_number(regexp_substr(r.new_str, '\$(\d+)', 1, 1, null, 1)) = c.crit_id
where regexp_substr(r.new_str, '\$\d+') is not null
)
select criteria, new_str
from rec
where regexp_substr(new_str, '\$\d+') is null
;
CRITERIA NEW_STR
--------- ------------------------------------
$1 = True Example 1 = True
$2 > $3 Example 2 > Example 3
$1 = $4 Example 1 = Example 2 + Example 3
3 rows selected.