Možná není nejúčinnější, ale funguje rekurzivně (tj. pokud crit_description
sám obsahuje "zástupné symboly", ty jsou také rozšířeny. (První řešení, jednodušší než to, co je uvedeno níže, tento rekurzivní krok neprovádělo.) Viz třetí ukázkový vstup, který jsem přidal. Zveřejním příspěvek znovu později, pokud jej budu moci ještě vyčistit.
POZNÁMKA:To předpokládá, že všechny "zástupné symboly" se skutečně nacházejí v criteria_info
stůl; Netestoval jsem, co se stane, když se nenajdou. OP uvést požadavek.
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.