Mungkin bukan yang paling efisien, tetapi bekerja secara rekursif (yaitu, jika crit_description
itu sendiri berisi "placeholder", itu juga diperluas. (Solusi pertama, lebih sederhana dari apa yang ditunjukkan di bawah, tidak melakukan langkah rekursif ini.) Lihat input sampel ketiga yang saya tambahkan. Saya akan memposting lagi nanti jika saya bisa membersihkannya lagi.
CATATAN:Ini mengasumsikan semua "placeholder" benar-benar ditemukan di criteria_info
meja; Saya tidak menguji apa yang terjadi jika mereka tidak ditemukan. OP untuk menyatakan persyaratan.
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.