2009-12-22 13 views
10

Sto avendo una prima dolorosa esperienza con PostgreSQL, e il minuto-sfida del momento è:Postgresql - funzione simile a concat_ws?

come eseguire un concat_ws in PostgreSQL, ad unirsi valore di diversi campi da un gruppo da:

select concat_ws(';',field_lambda) from table_lambda group by id; 
+2

FYI, concat_ws saranno in PostgreSQL 9.1 : http://developer.postgresql.org/pgdocs/postgres/functions-string.html –

+0

.. ma in Postgres 'concat_ws()' è * non * una funzione di aggregazione. Usa invece 'string_agg()'. Vedi sotto. –

risposta

14

per PostgreSQL 8.4 e superiori:

select ARRAY_TO_STRING(
    ARRAY_AGG(field_lambda),';' 
) from table_lambda group by id; 
+1

Grazie, funziona. – Gzorg

2

Senza array_agg (prima della 8.4), è possibile utilizzare:

SELECT array_to_string(
    ARRAY(SELECT field_lambda FROM table_lambda GROUP BY id), ';' 
); 
0

Secondo PostgreSQL wiki, è possibile emulare la funzione PostgreSQL 8.4 array_agg per avvicinarsi a ciò che è necessario.

CREATE AGGREGATE array_agg(anyelement) (
    SFUNC=array_append, 
    STYPE=anyarray, 
    INITCOND='{}' 
); 
4

Dal PostgreSQL 9,0 (uscita nel settembre 2010), v'è la funzione di aggregazione string_agg() di fare quello che ti sembra di volere:

SELECT string_agg(field1, ';') FROM tbl GROUP BY id; 

nota, che il secondo parametro è il separatore (simile ad altre funzioni aggregate).

C'è anche la funzione di stringa concat_ws() dal PostgreSQL 9.1 , che sta facendo altrimenti lo stesso di MySQL concat_ws() (quando non è abusato come funzione di aggregazione). È particolarmente utile gestire i valori NULL.

SELECT concat_ws(';', field1, field2, field3) FROM tbl 

Si può anche combinare sia per aggreagate più colonne nel modo desiderato.

SELECT id, string_agg(concat_ws(',', field1, field2, field3), ';') AS fields 
FROM tbl 
GROUP BY id; 
-1

Ulteriori persone che vengono qui per questo problema, questo metodo non funzionerebbero con più colonne (come concat_ws sarebbe) se si desidera supportare più colonne utilizzano

ARRAY_TO_STRING(ARRAY[$columns_string], 'my_delimiter'). 
Problemi correlati