Oracle
 sql >> база данни >  >> RDS >> Oracle

Таблица със заявки с различен списък от променливи, използвайки like

Ако разбирам добре нуждата ви, това може да е начин.

Да кажем, че имате таблица като тази:

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

Това може да е начин:

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)

Идеята тук е да разделите входния си низ на много редове и след това да обедините получените редове по азбучен ред, след което да приложите същия ред към стойностите в таблицата и след това да проверите дали подредените низове са равни.

Тази част се използва за разделяне, подреждане и агрегиране на входните стойности, така че резултатът да е подреден низ:

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

дава:

ABCD

Тази част се използва, за да направи същото на вашата маса:

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  

дава:

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

Обединяването между тези частични резултати е доста лесно и просто проверява дали във вашата таблица съществува стойност (подредена), която съответства на (подредения) входен низ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Нулирайте последователността до определена стойност

  2. PK е нарушен в oracle sql

  3. Как да избегнем тази много тежка заявка, която забавя приложението?

  4. org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter ГРЕШКА

  5. Как мога да избера от списък със стойности в Oracle