Получить один элемент из массива jsonb в PostgreSQL - PullRequest
0 голосов
/ 04 декабря 2018

В моей базе данных PostgreSQL есть следующая схема:

CREATE TABLE survey_results (
    id integer NOT NULL
);

CREATE TABLE slide_results (
    id integer NOT NULL,
    survey_result_id integer,
    buttons jsonb DEFAULT '[]'::jsonb
);

INSERT INTO survey_results (id)
  VALUES (1);

INSERT INTO slide_results (id, survey_result_id, buttons)
  VALUES (1, 1, '[{"text": "Not at all"}, {"text": "Yes"}]');

INSERT INTO slide_results (id, survey_result_id, buttons)
  VALUES (2, 1, '[{"text": "No"}, {"text": "Yes"}]');

И следующий запрос:

WITH data AS ( 
  select 
    sr.id ,
    jsonb_agg(row_to_json(slr)) AS json_row
  from slide_results slr
  INNER JOIN survey_results sr ON sr.id = slr.survey_result_id
  group by sr.id
)

SELECT id, json_row->0->>'buttons' from data;

, который возвращает:

| id  | ?column?                                  |
| --- | ----------------------------------------- |
| 1   | [{"text": "Not at all"}, {"text": "Yes"}] |

Я хочуэтот запрос возвращает только первый элемент массива кнопок.Я пробовал что-то вроде этого:

WITH data AS ( 
  select 
    sr.id ,
    jsonb_agg(row_to_json(slr)) AS json_row
  from slide_results slr
  INNER JOIN survey_results sr ON sr.id = slr.survey_result_id
  group by sr.id
)

SELECT id, json_row->0->>'buttons'->>1 from data;

, но это возвращает мне ошибку:

Query Error: error: operator does not exist: text ->> integer

Как я могу это исправить?

https://www.db -fiddle.com / ж / gP761psywgmovfdTT7DjP4 / 1

1 Ответ

0 голосов
/ 04 декабря 2018
SELECT id, json_row->0->'buttons'->>0 from data;

Вы ссылаетесь на 'buttons' как текст вместо объекта.

Также индекс массива равен 0, поэтому при указании на 1 будет получен 2-й элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...