Postgresql запрос массива объектов в фильтре полей JSONB Specifi c Object - PullRequest
0 голосов
/ 13 февраля 2020
CREATE TABLE company (id SERIAL, companyJson JSONB);
CREATE INDEX comapny_gin_idx ON company USING gin (companyJson);

INSERT INTO company (id, companyJson) 
  VALUES (1, '[{"name": "t", "company": "company1"}]');

INSERT INTO company (id, companyJson) 
  VALUES (2, '[{"name": "b", "company":"company2"}, {"name": "b", "company":"company3"}]');


 SELECT * FROM company WHERE companyJson @> '[{"company": "company2" , "name": "b"}]';

Вывод вышеуказанной программы:

2   [{"name": "b", "company": "company2"}, {"name": "b", "company": "company3"}]

Есть ли способ вернуть {"name": "b", "company": "company2"} вместо целой строки.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Вы можете напрямую вернуть первый компонент через companyJson -> 0, который содержит -> операнд, возвращающий первый компонент с нулевым аргументом:

 SELECT companyJson -> 0 as companyJson
   FROM company 
  WHERE companyJson @> '[{"company": "company2" , "name": "b"}]';

Демо

0 голосов
/ 13 февраля 2020

Я могу думать только о том, чтобы удалить массив и вернуть элемент из него:

SELECT x.j
FROM company c
  cross join jsonb_array_elements(c.companyjson) as x(j)
where x.j = '{"company": "company2" , "name": "b"}'
...