Jeśli dobrze rozumiem Twoje potrzeby, może to być sposób.
Załóżmy, że masz taki stół:
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
).
To może być sposób:
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)
Pomysł polega na tym, aby podzielić ciąg wejściowy na wiele wierszy, a następnie zagregować wynikowe wiersze w kolejności alfabetycznej, a następnie zastosować tę samą kolejność do wartości w tabeli, a następnie sprawdzić, czy uporządkowane ciągi są równe.
Ta część służy do dzielenia, porządkowania i agregowania wartości wejściowych, tak aby wynik był uporządkowanym ciągiem:
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
daje:
ABCD
Ta część służy do robienia tego samego na twoim stole:
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
daje:
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
Połączenie między tymi częściowymi wynikami jest dość proste i po prostu sprawdza, czy w Twojej tabeli istnieje wartość (uporządkowana), która odpowiada (uporządkowanemu) łańcuchowi wejściowemu.