Machez
@Machez
Бу!

Как получить все записи с определенным значением в поле JSONB?

В PostgreSQL 9.4 имеется таблица с записями. Поле tags имеет тип JSONB.
0982ab2097254d439564f606cbc75906.jpg

Как получить, например, все записи у которых в поле tags имеется значение 1. Ниже привожу код и ошибку, которую он вызывает.

SELECT public.mytable.* FROM public.mytable WHERE tags ? 1;


ERROR: operator does not exist: jsonb ? integer
LINE 1: SELECT public.mytable.* FROM public.mytable WHERE tags ? 1;
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
********** Ошибка **********

ERROR: operator does not exist: jsonb ? integer
SQL-состояние: 42883
Подсказка: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Символ: 52
  • Вопрос задан
  • 3405 просмотров
Решения вопроса 2
@e11it
У вас, в колонке tags содержатся массивы целочисленных(на мой взгляд тип колонки выбран не удачно и лучше использовать array), а вы используете оператор поиска строки. Надо использовать оператор @> и искать пересечение массивов.

Пример:
CREATE TABLE aaa
(
  id serial NOT NULL,
  tags jsonb,
  CONSTRAINT aaa_pk PRIMARY KEY (id)
);

-- Значения - integer
INSERT INTO aaa(tags)
    VALUES ('[1, 2, 3]'::jsonb);

INSERT INTO aaa(tags)
    VALUES ('[2, 4, 1]'::jsonb);

-- Пример для оператора ? , элемент "1" - строка
INSERT INTO aaa(tags)
    VALUES ('[9, 9, "1"]'::jsonb);

-- ------------------------------------------
select * from aaa where tags @> '[1]'::jsonb;
-- OUTPUT:
-- id | tags
-- 1  | [1, 2, 3]
-- 2  | [2, 4, 1]

-- вывести записи где есть строка "1"
select * from aaa where tags ? '1';
-- OUTPUT:
-- id | tags
-- 3  | [9, 9, "1"]


Ссылка на документацию...
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Забавно.
Пересечения работают, можно их использовать.
select '[1,2,3]'::jsonb @> '[2]'::jsonb;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы