Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Bảng truy vấn với danh sách các biến khác nhau bằng cách sử dụng như

Nếu tôi hiểu rõ nhu cầu của bạn, đây có thể là một cách.

Giả sử bạn có một bảng như thế này:

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

Đây có thể là một cách:

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)

Ý tưởng ở đây là chia chuỗi đầu vào của bạn thành nhiều hàng, sau đó tổng hợp các hàng kết quả theo thứ tự bảng chữ cái, sau đó áp dụng cùng một thứ tự trên các giá trị trong bảng và sau đó kiểm tra xem các chuỗi được sắp xếp có bằng nhau không.

Phần này được sử dụng để tách, sắp xếp và tổng hợp các giá trị đầu vào, để kết quả là một chuỗi có thứ tự:

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

cho:

ABCD

Phần này được sử dụng để làm tương tự trên bảng của bạn:

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  

cho:

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

Việc kết hợp giữa các kết quả từng phần này khá đơn giản và chỉ cần kiểm tra xem một giá trị (được sắp xếp) có tồn tại trong bảng của bạn tương ứng với chuỗi đầu vào (được sắp xếp) hay không.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để tránh các giá trị 0 bằng cách sử dụng hàm MIN và MAX trong SQL?

  2. Làm cách nào để tôi có thể chèn nhiều hàng vào oracle với một giá trị thứ tự?

  3. Phương pháp thu thập:Các hàm ĐẦU TIÊN &CUỐI CÙNG trong Cơ sở dữ liệu Oracle

  4. Cách tìm nạp dữ liệu từ con trỏ trong Oracle bằng For Loop

  5. so sánh ngày với một định dạng được xác định trước. pl sql