Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ersetzen Sie einen Teil des Felds durch Werte aus der Abfrage

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.