Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Tabel kueri dengan daftar variabel yang berbeda menggunakan like

Jika saya memahami dengan baik kebutuhan Anda, ini bisa menjadi jalan.

Katakanlah Anda memiliki tabel seperti ini:

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

Ini bisa jadi caranya:

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)

Idenya di sini adalah untuk membagi string input Anda dalam banyak baris, dan kemudian menggabungkan baris yang dihasilkan dalam urutan abjad, kemudian menerapkan urutan yang sama pada nilai dalam tabel dan kemudian memeriksa apakah string yang dipesan sama.

Bagian ini digunakan untuk memisahkan, mengurutkan, dan mengagregasi nilai input, sehingga hasilnya adalah string terurut:

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

memberikan:

ABCD

Bagian ini digunakan untuk melakukan hal yang sama di meja Anda:

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  

memberikan:

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

Penggabungan antara hasil parsial ini cukup mudah dan hanya memeriksa apakah ada nilai (diurutkan) di tabel Anda yang sesuai dengan string input (diurutkan).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan Oracle's GUID()-generated ID di Grails/Hibernate

  2. cara menemukan indeks pada tabel di oracle

  3. Sql query untuk memeriksa apakah substring kolom 1 berisi nilai kolom lain

  4. Kondisi pemicu di semua baris

  5. Gabung luar Oracle tidak berfungsi seperti yang diharapkan