Проверьте, существует ли строка в массиве Postgres JSONB

#sql #json #postgresql

Вопрос:

Я ищу способ узнать, существует ли строка в столбце Postgres типа «jsonb», которая имеет значения, подобные приведенным ниже:

 id | numbers(jsonb)
1  | ["54954565","16516516","565196212"]
2  | ["195195159","252432","275782872"]
3  | ["54954565","61595161","728278"]
4  | ["245735435","75454","2782"]
 

Напр.:

Если «16516516» существует в массиве, соответствующем любой записи в числах, я хочу получить всю строку.

Поэтому, если я запрошу «16516516».

Строка, которую я получаю, должна быть:

 id | numbers
1  | ["54954565","16516516","565196212"]```
 

Ответ №1:

вот что сделает ? оператор:

 select *
from the_table
where numbers ? '16516516'
 

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

Ответ №2:

Используйте оператор contains @>

 SELECT * FROM t 
WHERE numbers @> '["16516516"]'
 

Демонстрационная база данных<>скрипка<>:

 WITH t (id ,numbers) AS (
  VALUES (1,'["54954565","16516516","565196212"]'::jsonb),
         (2,'["195195159","252432","275782872"]'::jsonb),
         (3,'["54954565","61595161","728278"]'::jsonb),
         (4,'["245735435","75454","2782"]'::jsonb)
)
SELECT * 
FROM t WHERE numbers @> '["16516516"]';
 id |                numbers                
---- ---------------------------------------
  1 | ["54954565", "16516516", "565196212"]
(1 row)