sql >> Database >  >> RDS >> Oracle

Vervang een deel van het veld door waarden uit de query

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.


  1. Ontbrekende expressie bij het selecteren van alle kolommen en nog een

  2. InnoDB vs. MyISAM querytijd invoegen

  3. node-postgres met enorme hoeveelheid queries

  4. Hoe een kolom in een tabel te selecteren door een rij te maken in een andere tabel in MySQL