Запрос PostgreSQL для возврата результатов в виде списка, разделенного запятыми

97

Допустим, у вас есть SELECT id from tableзапрос (в действительности это сложный запрос), который возвращает вам несколько результатов.

Проблема в том, как получить все результаты idв одной строке через запятую?

Сорин
источник
4
возможный дубликат эквивалента Postgresql GROUP_CONCAT?
podiluska
Вышеупомянутый «обман» был актуален и полезен, особенно array_agg()функция в частности.
Jay Taylor

Ответы:

214

SELECT string_agg(id::text, ',') FROM table

Требуется PostgreSQL 9.0, но это не проблема.

Сорин
источник
Только что нашел это полезным. Благодарность!
gooddadmike
47
Обратите внимание, что, по крайней мере, для меня string_agg не нравилось использовать int в качестве первого аргумента, поэтому я сделал что-то вроде: string_agg(CAST(id as varchar), ',')вместо этого.
JZC
17
@JZC, или еще проще:string_agg(id::text, ',')
Alphaaa
6
Если вы хотите отсортировать столбецselect string_agg(id, ', ' order by id desc) from table
MA Hossain Tonu
1
Я столкнулся с дубликатами своего запроса, но решил его с помощьюSTRING_AGG(DISTINCT customer_name, ',')
ChristoKiwi
53

Вы можете использовать функции array () и array_to_string () вместе с вашим запросом. С участиемSELECT array( SELECT id FROM table ); вами получите результат , как: {1,2,3,4,5,6}

Затем, если вы хотите удалить знаки {}, вы можете просто использовать функцию array_to_string () и использовать запятую в качестве разделителя, поэтому: SELECT array_to_string( array( SELECT id FROM table ), ',' )получит результат вида: 1,2,3,4,5,6

Шут
источник
1
SELECT array_to_string( id, ',' ) AS id FROM table
Alex R.
13

Вы можете сгенерировать CSV из любого SQL-запроса с помощью psql:

$ psql
> \o myfile.csv
> \f ','  
> \a
> SELECT col1 AS column1, col2 AS column2 ... FROM ...

Полученный myfile.csv будет иметь имена столбцов набора результатов SQL в виде заголовков столбцов CSV и кортежи запросов в виде строк CSV.

ч / т http://pookey.co.uk/wordpress/archives/51-outputting-from-postgres-to-csv

Энтони Ван
источник
0

используйте функцию array_to_string () и array () для того же.

select array_to_string(array(select column_name from table_name where id=5), ', ');
Ашок Пармар
источник
Чем это лучше, чем использовать string_agg()?
a_horse_with_no_name
-1
SELECT array_agg(id, ',') FROM table

{1,2,3,4}

Я использую Postgres 11, и EntityFramework извлекает его как массив целых чисел.

profimedica
источник