Si entiendo bien tu necesidad, esta podría ser una forma.
Digamos que tienes una mesa como esta:
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
).
Esta podría ser una forma:
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)
La idea aquí es dividir su cadena de entrada en muchas filas y luego agregar las filas resultantes en orden alfabético, luego aplicar el mismo orden en los valores de la tabla y luego verificar que las cadenas ordenadas sean iguales.
Esta parte se usa para dividir, ordenar y agregar los valores de entrada, de modo que el resultado sea una cadena ordenada:
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
da:
ABCD
Esta parte se usa para hacer lo mismo en tu mesa:
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
da:
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
La unión entre estos resultados parciales es bastante sencilla y simplemente verifica si existe un valor (ordenado) en su tabla que corresponda a la cadena de entrada (ordenada).