сначала обработайте строку в наборы символов, затем перекрестно объедините наборы символов с самим собой, исключая строки, в которых наборы символов с обеих сторон совпадают.
Далее, агрегируйте и используйте BOOL_OR
в предложении HAVING
, чтобы отфильтровать любой набор символов, который является подмножеством любого другого набора символов
С образцом таблицы, разделенной в cte, запрос становится:
WITH foo(bar) AS (SELECT '("a,b" , "a,b,c" , "a,b,c,d" , "d,e")'::TEXT)
SELECT bar, string_to_array(elems[1], ',') not_subset
FROM foo
CROSS JOIN regexp_matches(bar, '[\w|,]+', 'g') elems
CROSS JOIN regexp_matches(bar, '[\w|,]+', 'g') elems2
WHERE elems2[1] != elems[1]
-- my regex also matches the ',' between sets which need to be ignored
-- alternatively, i have to refine the regex
AND elems2[1] != ','
AND elems[1] != ','
GROUP BY 1, 2
HAVING NOT BOOL_OR(string_to_array(elems[1], ',') <@ string_to_array(elems2[1], ','))
производит вывод
bar not_subset
'("a,b" , "a,b,c" , "a,b,c,d" , "d,e")' {'d','e'}
'("a,b" , "a,b,c" , "a,b,c,d" , "d,e")' {'a','b','c','d'}
пример в скрипте sql