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

Forespørgselstabel med forskellig liste over variabler ved hjælp af lignende

Hvis jeg godt forstår dit behov, kunne dette være en måde.

Lad os sige, at du har et bord som dette:

create table yourTable(setid, codes, messagedescr) as ( 
  select 1,       'A, B, C, D',  'You can login' from dual union all
  select 2,       'B, C, D'   ,  'You can login for one day' from dual union all
  select 3,       'A, C, E'   ,  'You can login but update your profile' from dual union all
  select 4,       'B, C, E, F',  'You cannot login' from dual
).

Dette kunne være en måde:

with inputData(codes) as (
    select listagg(trim (regexp_substr(input_codes, '[^,]+', 1, level))) within group ( order by trim (regexp_substr(input_codes, '[^,]+', 1, level)))
    from ( select 'A, D, C, B' as input_codes from dual )  /* the input string */
    CONNECT BY instr(input_codes, ',', 1, level - 1) > 0
)    
select *
from inputData 
    inner join (
                select listagg(trim (regexp_substr(codes, '[^,]+', 1, level)))
                         within group ( order by trim (regexp_substr(codes, '[^,]+', 1, level))) as codes,
                        messagedescr
                from yourTable  
                CONNECT BY instr(codes, ',', 1, level - 1) > 0
                  and prior setId = setId
                  and prior sys_guid() is not null
                group by setId, messagedescr
               )
      using (codes)

Ideen her er at opdele din inputstreng i mange rækker og derefter aggregere de resulterende rækker i alfabetisk rækkefølge, derefter anvende den samme rækkefølge på værdierne i tabellen og derefter kontrollere, at de ordnede strenge er ens.

Denne del bruges til at opdele, bestille og aggregere inputværdierne, så resultatet er en ordnet streng:

select listagg(trim (regexp_substr(input_codes, '[^,]+', 1, level))) within group ( order by trim (regexp_substr(input_codes, '[^,]+', 1, level)))
    from ( select 'A, D, C, B' as input_codes from dual )  /* the input string */
    CONNECT BY instr(input_codes, ',', 1, level - 1) > 0

giver:

ABCD

Denne del bruges til at gøre det samme på dit bord:

select listagg(trim (regexp_substr(codes, '[^,]+', 1, level)))
         within group ( order by trim (regexp_substr(codes, '[^,]+', 1, level))) as codes,
        messagedescr
from yourTable  
CONNECT BY instr(codes, ',', 1, level - 1) > 0
  and prior setId = setId
  and prior sys_guid() is not null
group by setId, messagedescr  

giver:

CODES      MESSAGEDESCR
---------- -------------------------------------
ABCD       You can login
BCD        You can login for one day
ACE        You can login but update your profile
BCEF       You cannot login

Sammenkædningen mellem disse delresultater er ret ligetil og kontrollerer blot, om der findes en værdi (ordnet) i din tabel, der svarer til den (ordnede) inputstreng.



  1. Repliker min lokale database (Mysql) til fjerndatabase (phpmyadmin)

  2. Topforespørgsler om primærnøgle i Oracle med eksempler

  3. Sådan gemmes sessionsdata for brugeren

  4. MELLEM klausul versus <=OG>=