sql >> Databasteknik >  >> RDS >> Oracle

Frågetabell med olika lista över variabler med hjälp av like

Om jag förstår ditt behov så kan detta vara ett sätt.

Säg att du har ett bord så här:

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
).

Detta kan vara ett sätt:

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)

Tanken här är att dela upp din inmatningssträng i många rader och sedan aggregera de resulterande raderna i alfabetisk ordning, sedan tillämpa samma ordning på värdena i tabellen och sedan kontrollera att de ordnade strängarna är lika.

Den här delen används för att dela, ordna och aggregera indatavärdena, så att resultatet blir en ordnad sträng:

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

ger:

ABCD

Den här delen används för att göra samma sak på ditt 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  

ger:

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

Kopplingen mellan dessa delresultat är ganska enkel och kontrollerar helt enkelt om det finns ett värde (ordnat) i din tabell som motsvarar den (ordnade) inmatningssträngen.



  1. SQL Server PIVOT med flera X-axelkolumner

  2. Problem med att ställa in en anpassad primärnyckel i en Rails 4-migrering

  3. Hur kan jag hitta den underliggande kolumnen och tabellnamnet för en Oracle-vy?

  4. Alias ​​för att visa tabeller MySQL-resultat