sql >> Databasteknik >  >> RDS >> Oracle

Ersätt en del av fältet med värden från frågan

Kanske inte det mest effektiva, men det fungerar rekursivt (det vill säga om crit_description själv innehåller "platshållare", de utökas också. (En första lösning, enklare än vad som visas nedan, gjorde inte detta rekursiva steg.) Se den tredje exempelinmatningen som jag lade till. Jag skriver igen senare om jag kan rensa upp det lite mer.

OBS:Detta förutsätter att alla "platshållare" faktiskt finns i criteria_info tabell; Jag testade inte vad som händer om de inte hittas. OP för att ange 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. Vad betyder operatorn :=i mysql?

  2. Använda ODBC med Salesforce och Active Directory Federation Services (ADFS) Single Sign On (SSO)

  3. mySQL-kolumn för att hålla array

  4. Kan jag återställa en transaktion som jag redan har genomfört? (dataförlust)