#sql #arrays #postgresql #subquery #jsonb
#sql #массивы #postgresql #подзапрос #jsonb
Вопрос:
У меня есть таблица PostgreSQL, подобная этой:
Table t
id | keys (jsonb)
--- ----------------
1 | ["Key1", "Key2"]
Моя цель — запросить эту таблицу, чтобы выяснить, содержится ли один из ключей списка в столбце массива jsonb «keys».
Мне удалось получить результат, используя:
SELECT *
FROM t
WHERE keys ?| Array ['Key1', 'Key2'];
Однако я не могу найти способ расширить этот запрос, применив lower() к значениям «ключей» в таблице.
Есть ли способ перебирать элементы, чтобы применить lower() к каждому из них?
Комментарии:
1.
jsonb_array_elements_text
?2. Спасибо, что указали мне в этом направлении, jsonb_array_elements_text действительно был правильным решением.
Ответ №1:
Благодаря ответам выше мне удалось найти способ сделать это следующим образом:
SELECT *
FROM t, jsonb_array_elements_text(keys) key
WHERE lower(key) in ('key1', 'key2') ;
Комментарии:
1. Возможно, вы захотите
SELET t.*
избежать сопоставленияkey
(если, конечно, вы этого не хотите) и обратите внимание, что это может возвращать одну и ту же строку несколько раз, если вkeys
массиве есть дубликаты или совпадения с несколькими терминами.2. Да, вы правы, но в моем случае это не имеет большого значения, поскольку я верну логическое значение, если будет найдено совпадение (count> 0).
Ответ №2:
Возможно, вам потребуется отменить оба массива:
select *
from t
where exists (
select 1
from jsonb_array_elements_text(t.keys) k1(val)
inner join unnest(array['Key1', 'Key2']) k2(val)
on lower(k1.val) = lower(k2.val)
)