Таблица :
id matchers
1 [{"abc": 1, "pattern": "ABC"}, {"pattern": "ABAB"}, {"cde": "FOO", "pattern": "AABB"}]
2 [{"pattern": "AB"}, {"cde": "BAR", "pattern": "CDE"}]
3 [{"abc": 2, "pattern": "CD"}, {"pattern": "FG"}]
Запрос :
SELECT DISTINCT -- C
id,
matchers
FROM (
SELECT
*,
jsonb_array_elements(a.matchers)->>'pattern' as pattern -- A
FROM a
) s
WHERE
pattern LIKE '%AB%' -- B
A: jsonb_array_elements
расширяет массив json до одной строки вэлемент массива.Оператор ->>
дает значение атрибута pattern, содержащегося в каждом элементе массива, в виде текста.
B: фильтрация текстовых значений с помощью оператора LIKE
C: поскольку таблица развернутамы должны уменьшить его еще раз, поскольку нам нужны только исходные столбцы, которые мы сохранили в подзапросе в каждой строке.
Результат :
id matchers
1 [{"abc": 1, "pattern": "ABC"}, {"pattern": "ABAB"}, {"cde": "FOO", "pattern": "AABB"}]
2 [{"pattern": "AB"}, {"cde": "BAR", "pattern": "CDE"}]
демо: db <> fiddle
Если ваш столбец имеет тип json
вместо jsonb
, вы должны использовать, конечно, json_array_elements
.
Редактировать: После того, как вопрос стал более понятным, выяснилось, что сценарий использования шаблона является другим.Таким образом, ожидаемый результат может быть достигнут путем изменения предложения WHERE
на:
'long input string including pattern' LIKE '%' || pattern || '%'
Дальнейшее чтение