Запрос 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 извлекает его как массив целых чисел.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.