sql >> Databáze >  >> RDS >> Oracle

Tabulka dotazů s různým seznamem proměnných pomocí like

Pokud dobře rozumím vaší potřebě, mohla by to být cesta.

Řekněme, že máte takovou tabulku:

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

Toto by mohl být způsob:

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)

Cílem je rozdělit svůj vstupní řetězec do mnoha řádků a poté agregovat výsledné řádky v abecedním pořadí, poté použít stejné pořadí na hodnoty v tabulce a poté zkontrolovat, zda jsou seřazené řetězce stejné.

Tato část se používá k rozdělení, řazení a agregaci vstupních hodnot, takže výsledkem je uspořádaný řetězec:

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

dává:

ABCD

Tato část se používá k provedení stejného na vašem stole:

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  

dává:

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

Spojení mezi těmito částečnými výsledky je poměrně jednoduché a jednoduše zkontroluje, zda ve vaší tabulce existuje hodnota (uspořádaná), která odpovídá (uspořádanému) vstupnímu řetězci.



  1. Porovnání možností cloudové databáze pro PostgreSQL

  2. Jak nasadit klastr MariaDB pro vysokou dostupnost

  3. Pro názvy sloupců použijte seznam Pythonu v dotazu SQL

  4. Používání relačních databází MySQL na Gentoo