Запросите вложенный jsonb с помощью postgres - PullRequest
0 голосов
/ 10 октября 2018

У меня есть вложенный столбец jsonb, и я пытаюсь запросить поле в jsonb, КАК значение или точное значение, используя Postgres9.6

Таблица: test

Столбец Jsonb: данные

{
"subject":[
{
          "test1": "blue",
          "test2": "12",
          "test3": "green"
          },
          {
          "test1": "red",
          "test2": "1234",
          "test3": "green"
          }
]}

Я пробовал это:

SELECT * from test where data ->'subject'->>'test2' like '%12%';

Также пробовал запрос на сдерживание:

SELECT '{"test":{test1: "blue"}}' :: jsonb@> '{"test":{}}'::jsonb

Наконец, попытался получить доступ к элементам jsonbно получить столбец "1234" не существует ошибка.

SELECT * FROM test
WHERE EXISTS (SELECT FROM jsonb_array_elements(test.data -> 'subject') as s
    WHERE (s->'test2'= "1234"));

Первый запуск, но я не получаю данных обратно.

Функция, которая ошибки

CREATE FUNCTION search_data (search text)
  RETURNS setof test AS $$
SELECT *
FROM test t, jsonb_array_elements(t.data->'subject') e
WHERE e.value->>'test2' like '%search%';
$$ language sql stable;

1 Ответ

0 голосов
/ 10 октября 2018

Полагаю, вам нужно что-то вроде:

SELECT *
FROM test t, jsonb_array_elements(t.data->'subject') e
WHERE e.value->>'test2' like '%12%';

На самом деле, я только что заметил, что у вас почти все работает с вашим последним запросом, но есть пара незначительных синтаксических и логических ошибок:

  1. вам нужны одинарные кавычки, а не двойные кавычки вокруг строкового литерала '1234' (именно поэтому вы получаете сообщение об ошибке «нет такого столбца»), и:
  2. вам нужно использовать ->> вместо -> для извлечения data->'test2', поэтому он извлекается как varchar, а не jsonb.В противном случае значение будет заключено в двойные кавычки позже при оценке запроса, когда jsonb неявно преобразуется в varchar, чтобы сравнить его с '1234'::varchar

Запрос ниже работает для меня:

SELECT * FROM test
WHERE EXISTS (SELECT FROM jsonb_array_elements(test.data->'subject') as s
    WHERE (s->>'test2' = '1234'));

См. Мой дБ <> скрипка

...