Postgresql присоединиться к массиву и преобразовать в JSON - PullRequest
0 голосов
/ 01 мая 2018

Я хотел бы объединить массив, содержащий идентификаторы, и преобразовать результат этого выбора в json (массив json).

У меня есть следующая модель:

enter image description here Столбец lnam_refs содержит идентификаторы, которые относятся к столбцу lnam

Я хотел бы преобразовать столбец lnam_refs во что-то вроде [row_to_json (), row_to_json ()] или [] или [row_to_json ()] или…

Я пробовал несколько способов, но не могу добиться чистого результата ...


Чтобы быть понятнее:

Table in input: 
   id   |        label         |   lnam   |       lnam_refs 
--------+----------------------+----------+-----------------------
    1   |      'master1'       | 11111111 | {33333333}
    2   |      'master2'       | 22222222 | {44444444,55555555}
    3   |      'slave1'        | 33333333 | {}
    4   |      'slave2'        | 44444444 | {}
    5   |      'slave3'        | 55555555 | {}
    6   |      'master3'       | 66666666 | {}

Results Expected:
   id   |        label         |   lnam   |       lnam_refs       |             slaves
--------+----------------------+----------+-----------------------+---------------------------------  
    1   |      'master1'       | 11111111 | {33333333}            | [ {id: 3, label: 'slave1', lnam: 33333333, lnam_refs: []} ]
    2   |      'master2'       | 22222222 | {44444444,55555555}   | [ {id: 4, label: 'slave2', lnam: 44444444, lnam_refs: []}, {id: 5, label: 'slave3', lnam: 55555555, lnam_refs: []} ]
    6   |      'master3'       | 66666666 | {}                    | []

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 01 мая 2018

Вот один из способов сделать это. (Я создал таблицу с именем t на основе предоставленных вами данных.)

SELECT *, (SELECT JSON_AGG(ROW_TO_JSON(t2)) FROM t t2 WHERE label LIKE 'slave%' AND lnam = ANY(t1.lnam_refs)) AS slaves
FROM t t1
WHERE label LIKE 'master%'

Я использую поле label в предложении WHERE, так как не знаю, как еще вы определяете, какие записи должны быть основными и т. Д.

Результат:

1;master1;11111111;{33333333};[{"id":3,"label":"slave1","lnam":33333333,"lnam_refs":[]}]
2;master2;22222222;{44444444,55555555};[{"id":4,"label":"slave2","lnam":44444444,"lnam_refs":[]}, {"id":5,"label":"slave3","lnam":55555555,"lnam_refs":[]}]
6;master3;66666666;{};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...