Оставляя в стороне проблемы с моделью данных, если вам нужно сравнить содержимое двух строк CSV, игнорируя при этом порядок отображения элементов, вам нужно разбить хотя бы одну из них на составные части.
Это основано на like
сравнении @Tim, разделив предоставленное пользователем значение на отдельные значения в CTE, соединив его с реальной таблицей с помощью механизма like
, а затем посчитав, сколько совпадений было.
with cte (val, cnt) as (
select regexp_substr('45,489', '(.*?)(,|$)', 1, level, null, 1),
regexp_count('45,489', ',') + 1
from dual
connect by level <= regexp_count('45,489', ',') + 1
)
select t.id, t.col
from your_table t
join cte on ',' || t.col || ',' like '%,' || cte.val || ',%'
group by t.id, t.col
having count(cte.val) = max(cte.cnt)
Возвращает только те строки, в которых количество соединенных значений соответствует количеству соединенных значений.
Быстрая демонстрация с образцами данных в другом CTE:
with your_table (id, col) as (
select 'a', '12' from dual
union all select 'b', '489' from dual
union all select 'c', '456,486' from dual
union all select 'd', '489,45,789' from dual
union all select 'e', '1,489,2,45,3' from dual
union all select 'f', '1,489,2,45,3,489' from dual
),
cte (val, cnt) as (
select regexp_substr('45,489', '(.*?)(,|$)', 1, level, null, 1),
regexp_count('45,489', ',') + 1
from dual
connect by level <= regexp_count('45,489', ',') + 1
)
select t.id, t.col
from your_table t
join cte on ',' || t.col || ',' like '%,' || cte.val || ',%'
group by t.id, t.col
having count(cte.val) = max(cte.cnt);
ID COL
-- -------------------
f 1,489,2,45,3,489,45
d 489,45,789
e 1,489,2,45,3