Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

जैसे . का उपयोग कर चर की विभिन्न सूची के साथ क्वेरी तालिका

अगर मैं आपकी ज़रूरत को अच्छी तरह समझता हूँ, तो यह एक तरीका हो सकता है।

मान लें कि आपके पास इस तरह की एक टेबल है:

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. ओरेकल डेटाबेस 11g एक्सप्रेस संस्करण को स्थापित करने के बाद एक नया डेटाबेस कैसे बनाएं?

  2. ओरेकल:अधिकतम (आईडी) +1 और अनुक्रम के बीच का अंतर। अगला

  3. SQL:अमान्य डेटा को तालिका में सम्मिलित होने से रोकने के लिए ट्रिगर

  4. Oracle संग्रहीत कार्यविधि में त्रुटि संदेश लॉग करें

  5. Oracle डेटाबेस में पिछली मध्यरात्रि में सेकंड की संख्या कैसे लौटाएं?