Фактически вы проверяете, что ВСЕ шаблоны во втором массиве соответствуют ЛЮБОМУ элементу в первом массиве.
Легко проверить, совпадают ли все элементы в первом массиве в массиве шаблонов (SELECT EVERY(u ILIKE ANY('{%pattern%}')) FROM UNNEST('{values}') AS u
), немного меньше, так что если есть случаи, когда несоответствие допустимо (например, первый случай, где элемент 2 в массиве 1 не соответствует, но возвращает TRUE).
Единственный способ, которым я могу думать об этом, - это сравнить каждый отдельный элемент в первом массиве с каждым отдельным шаблоном и сказать, что в каждом шаблоне должно быть хотя бы одно совпадение.
Это довольно уродливо, но дает правильные результаты. (Вы всегда можете заключить его в функцию.)
SELECT EVERY(match)
FROM (
SELECT BOOL_OR(value ILIKE pattern) AS match
FROM UNNEST('{%cde%,%mno%}'::TEXT[]) AS pattern
JOIN UNNEST('{abcdefg,hijklmnop}'::TEXT[]) AS value
ON TRUE
GROUP BY pattern
) AS matches
Итак, сначала он выводит массивы, чтобы сравнить каждое значение с каждым шаблоном в отдельности. (Вы можете сравнить значение с массивом шаблонов с помощью value ILIKE ANY('{your patterns}')
, но массив значений с шаблоном невозможен без удаления, я полагаю.)
Он выполняет BOOL_OR и группирует по шаблону, поэтому мы получаем один результат на шаблон; и этот результат: были ли какие-либо совпадения со значениями для этого шаблона?
Затем внешний запрос выполняет КАЖДЫЙ (так же, как BOOL_AND), чтобы проверить, является ли каждый результат истинным (то есть, каждый шаблон был сопоставлен); если это так, то он возвращает TRUE, иначе FALSE.