अगर मैं आपकी ज़रूरत को अच्छी तरह समझता हूँ, तो यह एक तरीका हो सकता है।
मान लें कि आपके पास इस तरह की एक टेबल है:
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
इन आंशिक परिणामों के बीच जुड़ाव काफी सीधा है और यह जांचता है कि क्या आपकी तालिका में कोई मान (आदेशित) मौजूद है जो (आदेशित) इनपुट स्ट्रिंग से मेल खाता है।