Запрос Postgres должен возвращать массив массива вместо массива строк - PullRequest
1 голос
/ 07 марта 2019

сильный текст У меня следующая проблема: Учитывая две таблицы контактов и организаций:

WITH contacts(oe_id, name, email, person_id) AS (VALUES
    (1, 'Mark', 'm.smith@test.nl', 19650728),
    (2, 'Tom', 't.b.smith@test.nl', 20010627), 
    (1, 'Frank', 'f.j.smith@test.nl', 20040709), 
    (3, 'Petra', 'p.ringenaldus@test.nl', 19700317), 
    (3, 'Paul', 'p.m.sprengers@test.nl', 19681006)),
organisations(oe_id, name) AS (VALUES
    (1, 'Cardiology'), 
    (2, 'Neurology'), 
    (3, 'Dermatology'), 
    (4, 'Churgery'))

Я хочу получить таблицу с 3 столбцами: название организации, идентификатор организации и массив контактных лиц для этой организации. Каждый элемент массива также является массивом с данными контактного лица.

Сначала я создал таблицу, в которой все столбцы контактов объединяются в массив. Один массив на строку кортежа:

 WITH contacts(oe_id, name, email, person_id) AS (VALUES
    (1, 'Mark', 'm.smith@test.nl', 19650728), 
    (2, 'Tom', 't.b.smith@test.nl', 20010627), 
    (1, 'Frank', 'f.j.smith@test.nl', 20040709), 
    (3, 'Petra', 'p.ringenaldus@test.nl', 19700317), 
    (3, 'Paul', 'p.m.sprengers@test.nl', 19681006)),
organisations(oe_id, name) AS (VALUES
    (1, 'Cardiology'), 
    (2, 'Neurology'), 
    (3, 'Dermatology'), 
    (4, 'Churgery')),
contacts_aggregated(oe_id, cdata) AS (
    select oe_id, ARRAY[name, email, person_id::text] from contacts) 
select * from contacts_aggregated;

Этот результат в:

 oe_id |                 cdata
-------+---------------------------------------
     1 | {Mark,m.smith@test.nl,19650728}
     2 | {Tom,t.b.smith@test.nl,20010627}
     1 | {Frank,f.j.smith@test.nl,20040709}
     3 | {Petra,p.ringenaldus@test.nl,19700317}
     3 | {Paul,p.m.sprengers@test.nl,19681006}
(5 rows)

Следующим шагом является объединение cdata (контактных данных) для каждой организации id:

WITH contacts(oe_id, name, email, person_id) AS (VALUES
    (1, 'Mark', 'm.smith@test.nl', 19650728), 
    (2, 'Tom', 't.b.smith@test.nl', 20010627), 
    (1, 'Frank', 'f.j.smith@test.nl', 20040709), 
    (3, 'Petra', 'p.ringenaldus@test.nl', 19700317), 
    (3, 'Paul', 'p.m.sprengers@test.nl', 19681006)),
organisations(oe_id, name) AS (VALUES
    (1, 'Cardiology'), 
    (2, 'Neurology'), 
    (3, 'Dermatology'), 
    (4, 'Churgery')),
contacts_aggregated(oe_id, cdata) AS (
    select oe_id, ARRAY[name, email, person_id::text] from contacts),
contacts_for_organisations(oe_id, contacts) AS (
    SELECT organisations.oe_id, array_agg(contacts_aggregated.cdata::text) 
    FROM organisations
    JOIN contacts_aggregated USING(oe_id) 
    GROUP BY oe_id)
SELECT * FROM contacts_for_organisations;

Это приводит к следующему:

 oe_id |                                      contacts
-------+------------------------------------------------------------------------------------
     1 | {"{Mark,m.smith@test.nl,19650728}","{Frank,f.j.smith@test.nl,20040709}"}
     2 | {"{Tom,t.b.smith@test.nl,20010627}"}
     3 | {"{Petra,p.ringenaldus@test.nl,19700317}","{Paul,p.m.sprengers@test.nl,19681006}"}
(3 rows)

Как видите, результатом является массив. Но его элементы также должны быть массивом. Вместо массива я получаю взорванный массив в виде строки.

Ват, я хочу что-то вроде этого:

 oe_id |                                      contacts
-------+------------------------------------------------------------------------------------
     1 | {{Mark,m.smith@test.nl,19650728},{Frank,f.j.smith@test.nl,20040709}}
     2 | {{Tom,t.b.smith@test.nl,20010627}}
     3 | {{Petra,p.ringenaldus@test.nl,19700317},{Paul,p.m.sprengers@test.nl,19681006}}
(3 rows)

Если я удаляю приведение к тексту array_agg (contacts_aggregated.cdata :: text, я получаю:

could not find array type for data type text[]

Что я забыл / делаю неправильно? Postgres: psql (9.2.24) и psql (9.6.10, сервер 9.2.24)

Если я запускаю код с помощью клиента postgres 9.6 на сервере postgres 9.6, все работает нормально.

1 Ответ

1 голос
/ 07 марта 2019

Я только что перешел на более высокую версию postgres, и теперь все работает нормально.

...