Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Tabela zapytań z inną listą zmiennych za pomocą like

Jeśli dobrze rozumiem Twoje potrzeby, może to być sposób.

Załóżmy, że masz taki stół:

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

To może być sposób:

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)

Pomysł polega na tym, aby podzielić ciąg wejściowy na wiele wierszy, a następnie zagregować wynikowe wiersze w kolejności alfabetycznej, a następnie zastosować tę samą kolejność do wartości w tabeli, a następnie sprawdzić, czy uporządkowane ciągi są równe.

Ta część służy do dzielenia, porządkowania i agregowania wartości wejściowych, tak aby wynik był uporządkowanym ciągiem:

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

daje:

ABCD

Ta część służy do robienia tego samego na twoim 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  

daje:

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

Połączenie między tymi częściowymi wynikami jest dość proste i po prostu sprawdza, czy w Twojej tabeli istnieje wartość (uporządkowana), która odpowiada (uporządkowanemu) łańcuchowi wejściowemu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd SQL:ORA-01861:literał nie pasuje do ciągu formatu 01861

  2. Dostrajanie SQL

  3. Oracle Cloud:tworzenie bazy danych autonomicznego przetwarzania transakcji (ATP)

  4. Dodanie tagu Html do tytułu zapytania Tree w Oracle APEX

  5. Co oznacza następujący błąd Oracle:nieprawidłowy indeks kolumny