Подзапрос как поле JSON - PullRequest
       6

Подзапрос как поле JSON

0 голосов
/ 28 февраля 2020

Используя гипотетическую схему:

CREATE TABLE obj (id INT, name VARCHAR);
CREATE TABLE objprop (obj_id INT, key VARCHAR, value VARCHAR);
INSERT INTO obj VALUES
    (1, 'Object 1'),
    (2, 'Object 2'),
    (3, 'Object 3');
INSERT INTO objprop VALUES
    (1, 'created', '2020-02-16'),
    (1, 'updated', '2020-02-28'),
    (2, 'created', '2020-02-01');

Могу ли я получить список объектов (по одному на строку) и поле JSON, которое представляет свойства объекта?

Я знаю, я можно использовать функцию ARRAY() с подзапросом для получения массива значений, например:

SELECT id, name, ARRAY(SELECT value FROM objprop where obj_id=id) values FROM obj;

+----+----------+------------------------------+
| id | name     | values                       |
+----+----------+------------------------------+
| 1  | Object 1 | {'2020-02-16', '2020-02-28'} |
| 2  | Object 2 | {'2020-02-01'}               |
| 3  | Object 3 | {}                           |
+----+----------+------------------------------+

Но могу ли я сделать запрос, который вместо ARRAY вернет мне JSON столбец с подзапросом в нем? Моя цель - получить, например:

+---+----------+----------------------------------------------------------------------------------------+
| 1 | Object 1 | [{"key": "created", "value": "2020-02-16"}, {"key": "updated", "value": "2020-02-28"}] |
| 2 | Object 2 | [{"key": "created", "value": "2020-02-01"}]                                            |
| 3 | Object 3 | []                                                                                     |
+---+----------+----------------------------------------------------------------------------------------+

1 Ответ

0 голосов
/ 28 февраля 2020
SELECT 
    id, 
    name, 
    COALESCE((
       SELECT json_agg(json_build_object('key', key, 'value', value))
       FROM objprop where obj_id=id
    ), '[]'::json) vals 
FROM 
    obj;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...