Получить записи, где json содержит определенный объект - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть таблица postgres 9.6 с полем json config. Я хочу получить записи из этой таблицы, где json имеет определенную пару ключ-значение.

Моя таблица выглядит следующим образом

CREATE TABLE features(
    id integer NOT NULL,
    plan character,
    config json NOT NULL
)

В поле json я храню json в виде

[
    { "name": "A", "state": "active"},
    { "name": "B", "state": "inactive"},
    { "name": "C", "state": "active"}
]

Теперь я запрашивая базу данных для извлечения всех записей, для которых поле json содержит пару ключ-значение { "name": "B", "state": "inactive"}.

Мой запрос выглядит следующим образом

select * from features where config @> '[{ "name": "B", "state": "inactive"}]';

Однако я получаю ошибка

ERROR:  operator does not exist: config @> unknown

Любая идея, где я иду не так здесь. Указатели будут высоко оценены. ТИА !!!

1 Ответ

1 голос
/ 23 апреля 2020

Оператор @> доступен только для типа данных jsonb:

CREATE TABLE features(
    id integer NOT NULL,
    plan character,
    config jsonb NOT NULL
);
CREATE 

insert into features values(1,'a',' [ { "name": "A", "state": "active"}, { "name": "B", "state": "inactive"}, { "name": "C", "state": "active"} ]');
INSERT 0 1

select * from features where  config @> '[{ "name": "B", "state": "inactive"}]';
 id | plan |                                                  config                                                  
----+------+----------------------------------------------------------------------------------------------------------
  1 | a    | [{"name": "A", "state": "active"}, {"name": "B", "state": "inactive"}, {"name": "C", "state": "active"}]
(1 row)

С типом данных json в таблице вы можете использовать:

select * from 
 (select json_array_elements(config)::jsonb  as item from features) as setofjsonb
where item = '{"name": "B", "state": "inactive"}'::jsonb;
                item                
------------------------------------
 {"name": "B", "state": "inactive"}
(1 row)
...