Być może nie jest to najbardziej wydajne, ale działa rekurencyjnie (to znaczy, jeśli crit_description
sama zawiera "symbole zastępcze", które również są rozwijane. (Pierwsze rozwiązanie, prostsze niż to, które pokazano poniżej, nie wykonało tego rekurencyjnego kroku.) Zobacz trzeci przykładowy wkład, który dodałem. Opublikuję ponownie później, jeśli będę mógł to posprzątać.
UWAGA:zakłada się, że wszystkie „symbole zastępcze” znajdują się w criteria_info
stół; Nie testowałem, co się stanie, jeśli nie zostaną znalezione. OP, aby określić wymagania.
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.