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


95

Скажімо, у вас є SELECT id from tableзапит (справжній випадок - це складний запит), який повертає вам кілька результатів.

Проблема полягає в тому, як отримати всі idповернення в один рядок, розділені комами?


4
можливий дублікат еквівалента Postgresql GROUP_CONCAT?
podiluska

Вищезазначений "дурень" був актуальним та корисним, особливо array_agg()функція зокрема.
Jay Taylor

Відповіді:


208

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
М. А. Хоссен Тону

1
Я зіткнувся з дублікатами свого запиту, але вирішив це за допомогоюSTRING_AGG(DISTINCT customer_name, ',')
ChristoKiwi

51

Ви можете використовувати функції 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
Алекс Р.

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.