Как объединить строки строкового поля в запросе группы 'PostgreSQL'? - PullRequest
311 голосов
/ 04 сентября 2008

Я ищу способ объединения строк поля в группе по запросу. Так, например, у меня есть таблица:

ID   COMPANY_ID   EMPLOYEE
1    1            Anna
2    1            Bill
3    2            Carol
4    2            Dave

и я хотел сгруппировать по company_id, чтобы получить что-то вроде:

COMPANY_ID   EMPLOYEE
1            Anna, Bill
2            Carol, Dave

В mySQL есть встроенная функция для этого group_concat

Ответы [ 14 ]

0 голосов
/ 15 марта 2019

Если вы находитесь в Amazon Redshift, где string_agg не поддерживается, попробуйте использовать listagg.

SELECT company_id, listagg(EMPLOYEE, ', ') as employees
FROM EMPLOYEE_table
GROUP BY company_id;
0 голосов
/ 04 декабря 2018

Я использую Jetbrains Rider, и было хлопотно копировать результаты из приведенных выше примеров для повторного выполнения, потому что казалось, что все это заключено в JSON. Это объединяет их в одно утверждение, которое было легче выполнить

select string_agg('drop table if exists "' || tablename || '" cascade', ';') 
from pg_tables where schemaname != $$pg_catalog$$ and tableName like $$rm_%$$
0 голосов
/ 30 августа 2018

Вы также можете использовать функцию форматирования. Который также может неявно заботиться о преобразовании типов text, int и т. Д. Сам по себе.

create or replace function concat_return_row_count(tbl_name text, column_name text, value int)
returns integer as $row_count$
declare
total integer;
begin
    EXECUTE format('select count(*) from %s WHERE %s = %s', tbl_name, column_name, value) INTO total;
    return total;
end;
$row_count$ language plpgsql;


postgres=# select concat_return_row_count('tbl_name','column_name',2); --2 is the value
0 голосов
/ 01 августа 2017

В соответствии с версией PostgreSQL 9.0 и выше вы можете использовать агрегатную функцию string_agg. Ваш новый SQL должен выглядеть примерно так:

SELECT company_id, string_agg(employee, ', ')
    FROM mytable GROUP BY company_id;
...