Oracle
 sql >> Database >  >> RDS >> Oracle

Sostituisci parte del campo con i valori della query

Forse non il più efficiente, ma funziona in modo ricorsivo (cioè, se il crit_description contiene "segnaposto", anche quelli sono espansi. (Una prima soluzione, più semplice di quella mostrata di seguito, non ha eseguito questo passaggio ricorsivo.) Vedere il terzo input di esempio che ho aggiunto. Pubblicherò di nuovo più tardi se riesco a ripulirlo ancora un po'.

NOTA:questo presuppone che tutti i "segnaposto" si trovino effettivamente in criteria_info tavolo; Non ho testato cosa succede se non vengono trovati. OP per dichiarare il requisito.

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.