Måske ikke den mest effektive, men den fungerer rekursivt (det vil sige, hvis crit_description
selv indeholder "pladsholdere", disse er også udvidet. (En første løsning, enklere end det, der er vist nedenfor, gjorde ikke dette rekursive trin.) Se det tredje eksempelinput, som jeg tilføjede. Jeg skriver igen senere, hvis jeg kan rydde lidt mere op.
BEMÆRK:Dette antager, at alle "pladsholdere" faktisk findes i criteria_info
bord; Jeg testede ikke, hvad der sker, hvis de ikke bliver fundet. OP for at angive 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.