Misschien niet de meest efficiënte, maar het werkt recursief (dat wil zeggen, als de crit_description
zelf bevat "placeholders", die zijn ook uitgebreid. (Een eerste oplossing, eenvoudiger dan wat hieronder wordt getoond, deed deze recursieve stap niet.) Zie de derde voorbeeldinvoer die ik heb toegevoegd. Ik zal later opnieuw posten als ik het wat meer kan opruimen.
OPMERKING:Dit veronderstelt dat alle "placeholders" daadwerkelijk worden gevonden in de criteria_info
tafel; Ik heb niet getest wat er gebeurt als ze niet worden gevonden. OP om de vereiste te vermelden.
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.