Поиск частичного значения в поле массива столбца jsonb с использованием PostgreSQL 12 - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть таблица, которая содержит поле jsonb с именем data. Это поле может содержать произвольные данные. Один из них может быть emails. Как;

{
  ...
  "emails": ["mark_spencer@example.com", "john@example.com"],
  ...
}

Итак, email поле является массивом. Обычно, если бы это была строка, я мог бы легко использовать ILIKE или ~* для этих данных, однако, будучи массивом, я думаю дважды. Потому что он все еще работает.

Выполненный мной запрос:

select * from test_tbl where "data" ->> 'emails' ILIKE '%spenc%';
-- OR --
select * from test_tbl where "data" ->> 'emails' ~* 'spenc';

См. Также: https://rextester.com/FFQ83366

Is правильно и безопасно использовать оператор ilike и / или ~* для элемента массива? Или есть лучший способ сделать эту работу?

Обратите внимание, что мне нужен частичный поиск, потому что клиент может дать только частичный поисковый запрос. Таким образом, поиск точного адреса электронной почты не вариант для меня (может быть, но не должен ограничиваться)

Я использую PostgreSQL 12.2

1 Ответ

2 голосов
/ 24 апреля 2020

Вам необходимо удалить массив:

select t.*
from test_tbl t
where exists (select *
              from jsonb_array_elements_text(t.data -> 'emails') as t(email)
              where t.email like '%spence%');

В качестве альтернативы вы можете использовать JSON путь выражение

select *
from test_tbl t
where data @? '$.emails[*] ? (@ like_regex ".*spenc.*")'

Онлайн пример

...