Vielleicht nicht die effizienteste, aber es funktioniert rekursiv (das heißt, wenn die crit_description
enthält selbst "Platzhalter", diese werden ebenfalls erweitert. (Eine erste Lösung, die einfacher als die unten gezeigte ist, hat diesen rekursiven Schritt nicht ausgeführt.) Siehe die dritte Beispieleingabe, die ich hinzugefügt habe. Ich werde später noch einmal posten, wenn ich es noch etwas aufräumen kann.
HINWEIS:Dies setzt voraus, dass alle "Platzhalter" tatsächlich in criteria_info
gefunden werden Tisch; Ich habe nicht getestet, was passiert, wenn sie nicht gefunden werden. OP, um die Anforderung anzugeben.
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.