sql >> Database >  >> RDS >> Oracle

Querytabel met verschillende lijst met variabelen met like

Als ik je behoefte goed begrijp, zou dit een manier kunnen zijn.

Stel dat je een tabel als deze hebt:

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

Dit zou een manier kunnen zijn:

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)

Het idee hier is om uw invoerreeks in veel rijen te splitsen en vervolgens de resulterende rijen in alfabetische volgorde samen te voegen, vervolgens dezelfde volgorde toe te passen op de waarden in de tabel en vervolgens te controleren of de geordende tekenreeksen gelijk zijn.

Dit deel wordt gebruikt om de invoerwaarden te splitsen, te ordenen en te aggregeren, zodat het resultaat een geordende string is:

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

geeft:

ABCD

Dit deel wordt gebruikt om hetzelfde te doen op uw tafel:

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  

geeft:

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

De join tussen deze gedeeltelijke resultaten is vrij eenvoudig en controleert eenvoudig of er een waarde (geordend) in uw tabel bestaat die overeenkomt met de (geordende) invoerreeks.



  1. Kan ik de databaselaag van Laravel zelfstandig gebruiken?

  2. Groeperen op maand en jaar in MySQL

  3. Mysql-database bijwerken met php

  4. Is het echt nodig om elke keer dat de applicatie start SQLite-tabellen te maken?