Postgres сравнивает каждый элемент в массиве с подстановочными знаками - PullRequest
0 голосов
/ 16 ноября 2018

У меня в postgres есть массив, в котором я пытаюсь сравнить отдельные элементы, используя подстановочные знаки.Ниже приведено то, что я хочу.

 SELECT '{abcdefg,hijklmnop}'::TEXT[] ILIKE '{%cde%}'::TEXT[];       --> TRUE
 SELECT '{abcdefg,hijklmnop}'::TEXT[] ILIKE '{%cde%,%foo%}'::TEXT[]; --> FALSE
 SELECT '{abcdefg,hijklmnop}'::TEXT[] ILIKE '{%cde%,%mno%}'::TEXT[]; --> TRUE

1 Ответ

0 голосов
/ 17 ноября 2018

Фактически вы проверяете, что ВСЕ шаблоны во втором массиве соответствуют ЛЮБОМУ элементу в первом массиве.

Легко проверить, совпадают ли все элементы в первом массиве в массиве шаблонов (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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...