преобразовать массив JSON в массив PostgreSQL для использования в объединении - PullRequest
0 голосов
/ 27 ноября 2018

Я использую Postgres 9.6, и у меня есть следующие две таблицы:

create table employees (
  id text,
  setting_id text -- references settings.id
);

create table settings (
  id text,
  setting_str text -- contains json string
);

insert into employees (id, setting_id) values ('e1', 's1');
insert into employees (id, setting_id) values ('e2', 's2');

insert into settings (id, setting_str)
   values ('s1', '{"vehicles" : null}');
insert into settings (id, setting_str)
   values ('s2', '{"vehicles" : ["Car", "Bike"]}');

Теперь я хочу получить вывод вида:

employee_id, name, vehicles
e1, one, null
e2, two, {"Car", "Bike"}

Я попытался выполнить следующий запрос:

select e.id,
       jsonb_array_elements_text(s.setting_str::jsonb #> '{vehicles}')
from employees e
   join settings s on s.id = e.setting_id;

Но это дает мне ошибку:

ERROR:  cannot extract elements from a scalar

Любая идея, как я могу извлечь массив JSON из текстового поля и отобразить его как массив строк Postgres (неjson массив, а не text) в операторе выбора?

1 Ответ

0 голосов
/ 27 ноября 2018

Модель данных не очень хорошая, поэтому запрос будет сложным.

Вы должны использовать реляционную модель для таких данных.

Вот запрос со встроенными комментариями:

SELECT e.id AS employee_id,
       s.id AS setting_id,
       /* construct an array of all vehicles that are not NULL */
       array_agg(v.p) FILTER (WHERE v.p IS NOT NULL) AS vehicles
FROM employees AS e
   JOIN settings AS s ON e.setting_id = s.id
   /* join with the "exploded" JSON array from s.setting_str */
   LEFT JOIN LATERAL json_array_elements_text(
                        /* replace "null" with an empty array */
                        COALESCE(
                           (s.setting_str::json) ->> 'vehicles',
                           '[]'
                        )::json
                     ) AS v(p) ON TRUE
GROUP BY e.id, s.id;

 employee_id | setting_id |  vehicles  
-------------+------------+------------
 e1          | s1         | 
 e2          | s2         | {Car,Bike}
(2 rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...