Как использовать LOWER() для элементов столбца jsonb в PostgreSQL?

#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)
)