Как запросить массивы Postgres JSONB с оператором = - PullRequest
1 голос
/ 05 марта 2019

Я ищу способ запроса поля массива jsonb postgres с видом = предложение.

Предположим, у меня есть таблица

CREATE TABLE events( id integer, tags jsonb, PRIMARY KEY(id) );

теги, имеющие значения типа ['Google', 'Hello World', 'Ruby']

Я прошел Поток Stackover и сделал подобные вещи.

И сформированный SQL похож на SELECT "events".* FROM "events" WHERE ("events"."tags" @> '{google}') ORDER BY "business_events"."id" desc;

Запустив это, я получаю эту ошибку =>

ERROR: invalid input syntax for type json LINE 1: ...siness_events" WHERE ("business_events"."tags" @> '{google}'... ^ DETAIL: Token "google" is invalid. CONTEXT: JSON data, line 1: {google...

Есть идеи?

1 Ответ

2 голосов
/ 05 марта 2019

Правильный операнд оператора @> должен быть допустимым json:

WITH events(id, tags) AS (
VALUES
    (1, '["Google", "Hello World", "Ruby"]'::jsonb)
)

SELECT events.* 
FROM events 
WHERE tags @> '["Google"]'

 id |               tags                
----+-----------------------------------
  1 | ["Google", "Hello World", "Ruby"]
(1 row)

Обратите внимание, что ключи и текстовые значения объектов json заключены в двойные кавычки.

Оператор принимает аргументы такими, какие они есть, и нет способа заставить его работать без учета регистра.Для этого можно использовать функцию jsonb_array_elements_text():

SELECT events.*
FROM events 
CROSS JOIN jsonb_array_elements_text(tags)
WHERE lower(value) = 'google';

Второе решение намного дороже, примечания в цитируемый ответ применимы и здесь.

...