LINUX.ORG.RU

select from jsonb

 


0

2

Мне нужно выбрать строку в которой есть определенное значение в json. С строками проблем нет. Положим я ищу строку в которой есть json в котором есть объект с «a» равным «2»:

xxx=> DROP TABLE IF EXISTS z;
DROP TABLE
xxx=> CREATE TABLE z (id bigint, value jsonb);
CREATE TABLE
xxx=> INSERT INTO z (id, value) VALUES (1, '{ "a" : "1" }');
INSERT 0 1
xxx=> INSERT INTO z (id, value) VALUES (2, '{ "a" : "2" }');
INSERT 0 1
xxx=> INSERT INTO z (id, value) VALUES (3, '{ "a" : "3" }');
INSERT 0 1
xxx=> SELECT * FROM z WHERE value->>'a' = '2';
 id |   value    
----+------------
  2 | {"a": "2"}
(1 строка)

Теперь положим что в json массив объектов и если в одном из объектов есть определенное текстовое поле, то мне нужна эта строка:

xxx=> DROP TABLE IF EXISTS z;
DROP TABLE
xxx=> CREATE TABLE z (id bigint, value jsonb);
CREATE TABLE
xxx=> INSERT INTO z (id, value) VALUES (1, '{ "b" : [ { "name" : "b1a" }, { "name" : "b1b" }, { "name" : "b1c" } ] }');
INSERT 0 1
xxx=> INSERT INTO z (id, value) VALUES (2, '{ "b" : [ { "name" : "b2a" }, { "name" : "b2b" }, { "name" : "b2c" } ] }');
INSERT 0 1
xxx=> INSERT INTO z (id, value) VALUES (3, '{ "b" : [ { "name" : "b3a" }, { "name" : "b3b" }, { "name" : "b3c" } ] }');
INSERT 0 1

Положим я ищу строку в которой есть json в котором есть массив в котором есть объект с «name» равным «b2b». Что то я туплю, подскажите плиз как должен выглядеть select?

Ответ на: комментарий от michey
xxx=> SELECT * FROM z WHERE value->>'b' @> '{"name":"b2b"}'::jsonb;
ОШИБКА:  оператор не существует: text @> jsonb
СТРОКА 1: SELECT * FROM z WHERE value->>'b' @> '{"name":"b2b"}'::jsonb...
                                            ^
ПОДСКАЗКА:  Оператор с данными именем и типами аргументов не найден. Возможно, вам следует добавить явные приведения типов.
quester ()
Последнее исправление: quester (всего исправлений: 1)
Ответ на: комментарий от quester

Оператор ->> возвращает text, а ты пытаешься работать с его результатом как с json(b).

->> int Get JSON array element as text
->> text Get JSON object field as text

Скорее всего, тебе нужно использовать оператор ->.

theNamelessOne ★★★★★ ()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от quester

А что ты ожидал? Оператор @> не производит поиск в массиве, он проверяет, что правый операнд «входит» в левый. Документацию-то читать надо наверно:

Does the left JSON value contain the right JSON path/value entries at the top level?

theNamelessOne ★★★★★ ()