Zapytanie PostgreSQL w celu zwrócenia wyników w postaci listy oddzielonej przecinkami

97

Powiedzmy, że masz plik SELECT id from table zapytanie (w rzeczywistości jest to zapytanie złożone), które zwraca kilka wyników.

Problem w tym, jak uzyskać wszystkie idzwroty w jednym wierszu, oddzielone przecinkami?

sorin
źródło
4
możliwy duplikat odpowiednika Postgresql GROUP_CONCAT?
podiluska
Powyższe „dupe” było istotne i przydatne, zwłaszcza w przypadku array_agg()funkcji.
Jay Taylor,

Odpowiedzi:

213

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

Wymaga PostgreSQL 9.0, ale to nie jest problem.

sorin
źródło
Okazało się, że to przydatne właśnie teraz. Dzięki!
gooddadmike
47
Zauważ, że przynajmniej dla mnie string_agg nie lubił brać int jako pierwszego argumentu, więc string_agg(CAST(id as varchar), ',')zamiast tego zrobiłem coś takiego:.
JZC
17
@JZC, a nawet łatwiej:string_agg(id::text, ',')
Alphaaa
6
Jeśli chcesz posortować kolumnęselect string_agg(id, ', ' order by id desc) from table
MA Hossain Tonu
1
W moim zapytaniu natrafiłem na duplikaty, ale rozwiązałem je zSTRING_AGG(DISTINCT customer_name, ',')
ChristoKiwi
53

Możesz użyć funkcji array () i array_to_string () razem z zapytaniem. ZSELECT array( SELECT id FROM table ); temu otrzymasz wynik taki jak: {1,2,3,4,5,6}

Następnie, jeśli chcesz usunąć znaki {}, możesz po prostu użyć funkcji array_to_string () i użyć przecinka jako separatora, więc: SELECT array_to_string( array( SELECT id FROM table ), ',' )otrzyma wynik taki jak: 1,2,3,4,5,6

Błazen
źródło
1
SELECT array_to_string( id, ',' ) AS id FROM table
Alex R.
13

Możesz wygenerować plik CSV z dowolnego zapytania SQL za pomocą psql:

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

Wynikowy plik myfile.csv będzie miał nazwy kolumn zestawu wyników SQL jako nagłówki kolumn CSV, a krotki zapytania jako wiersze CSV.

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

Anthony Wang
źródło
0

użyj funkcji array_to_string () i array () do tego samego.

select array_to_string(array(select column_name from table_name where id=5), ', ');
Ashok Parmar
źródło
Jak to jest lepsze niż używanie string_agg()?
a_horse_with_no_name
-1
SELECT array_agg(id, ',') FROM table

{1, 2, 3, 4}

Używam Postgres 11 i EntityFramework pobiera go jako tablicę liczb całkowitych.

profimedica
źródło