Kanske inte det mest effektiva, men det fungerar rekursivt (det vill säga om crit_description
själv innehåller "platshållare", de utökas också. (En första lösning, enklare än vad som visas nedan, gjorde inte detta rekursiva steg.) Se den tredje exempelinmatningen som jag lade till. Jag skriver igen senare om jag kan rensa upp det lite mer.
OBS:Detta förutsätter att alla "platshållare" faktiskt finns i criteria_info
tabell; Jag testade inte vad som händer om de inte hittas. OP för att ange kravet.
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.