Почему я не могу запросить напрямую jsonb_array_elements?

У меня есть данные, хранящиеся как jsonb в столбце с именем «данные»:

{'people': [{"name": "Bob", "Occupation": "janitor"}, {"name": "Susan", "Occupation", "CEO"}]}

Я могу запросить это через:

SELECT mydata.pk FROM mydata, jsonb_array_elements(mydata.data->'people') AS a WHERE (a->>'name') = 'bob' 

Почему я не могу заменить jsonb_array_elements(...) на "a"?:

SELECT mydata.pk FROM mydata WHERE (jsonb_array_elements(mydata.data->'people')->>'name') = 'bob' 

Вместо этого я получаю следующее:

ERROR:  argument of WHERE must not return a set

person Community    schedule 06.06.2015    source источник


Ответы (1)


Как говорится в сообщении об ошибке, аргументы WHERE не должны возвращать набор. jsonb_array_elements возвращает набор, и его нельзя сравнивать с одним значением. Во втором запросе у вас есть перекрестное соединение внутри выбора, которое преобразует его в подходящий результат для использования WHERE.

Вы также можете сделать это таким образом

SELECT mydata.pk FROM mydata
  WHERE 'Bob' in (SELECT jsonb_array_elements(mydata.data->'people')->>'name');

Здесь подзапрос позволит вам использовать оператор IN, чтобы найти нужное значение, поскольку результат больше не является набором.

Другой способ - напрямую запросить jsonb.

SELECT mydata.pk FROM mydata
  WHERE mydata.data->'people' @> '[{"name":"Bob"}]'::jsonb;

Таким образом, вам не нужно преобразовывать jsonb в набор результатов и искать в нем.

person Sami Kuhmonen    schedule 07.06.2015