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

Erstat en del af feltet med værdier fra forespørgsel

Måske ikke den mest effektive, men den fungerer rekursivt (det vil sige, hvis crit_description selv indeholder "pladsholdere", disse er også udvidet. (En første løsning, enklere end det, der er vist nedenfor, gjorde ikke dette rekursive trin.) Se det tredje eksempelinput, som jeg tilføjede. Jeg skriver igen senere, hvis jeg kan rydde lidt mere op.

BEMÆRK:Dette antager, at alle "pladsholdere" faktisk findes i criteria_info bord; Jeg testede ikke, hvad der sker, hvis de ikke bliver fundet. OP for at angive kravet.

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.


  1. Oracle samme tabelnavn på andet skema?

  2. Hvordan finder man ud af, om der findes en funktion i PostgreSQL?

  3. Flet flere rækker til en enkelt række

  4. Hvordan indsætter man data i Winform TreeView(C#) i effektiv kodning?