Concatenare stringhe di un campo raggruppate tramite group by in una query PostgreSQL

Data una query SELECT, sto cercando un modo per concatenare le stringhe presenti in un campo raggruppate tramite 'group by'.

Mi spiego meglio con un esempio, supponiamo di avere questa tabella:

ID   COMPANY_ID   EMPLOYEE
1       1                     Anna
2       1                     Bill
3       2                     Carol
4       2                     Dave

Se group_by agisce sulla foreign key 'COMPANY_ID' desidero che i nomi presenti nella colonna 'EMPLOYEE' vengano concatenati (affiancati), ottenendo un resultset simile a questo:

COMPANY_ID   EMPLOYEE
1                           Anna, Bill
2                           Carol, Dave

Esiste qualche funziona nativa in PostgreSQL che consente di fare questo? In pratica cerco qualcosa di analogo alla 'group_concat' di MySql solo che deve funzionare in PostgreSQL.

In Corso 2
PostgreSQL 01-06-2018 2 Risposte 4122 Visite 0
Carmen Lo Niuro

Carmen Lo Niuro

Autore di questa domanda

Risposte ( 2 approvate )

  1. Caterina Stoletti
    +2
    01-06-2018 12:34:10
    Rispondi

    Certo, nelle versioni più recenti di Postgres esiste la funzione string_agg(expression, delimiter) che ti consente di fare esattamente quello che chiedi, e ti permette anche di specificare un separatore per concatenare le varie stringhe

    SELECT company_id, string_agg(employee, ', ')
    FROM mytable
    GROUP BY company_id;

    Inoltre la string_agg ti consente anche di includere la clausola ORDER BY all'interno della funzione di aggregazione, così da consentirti non solo la concatenazione delle stringhe ma anche il loro ordinamento, che diversamente resterebbe indefinito.

    
    SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
    FROM mytable
    GROUP BY company_id;
    

     

    Per le versioni di Postegres precedenti alla 2010 (prima della 9.0 se non sbaglio) la funzione di aggregazione da utilizzare è la array_agg(expression) che a differenza della precedente inserisce le stringhe in un array e poi è necessario usare anche la funzione array_to_string() per ottenere la stringa intera concatenata, in questo modo

    
    SELECT company_id, array_to_string(array_agg(employee), ', ')
    FROM mytable
    GROUP BY company_id;
    
  2. Alberto Orfiesi
    0
    01-06-2018 12:38:54
    Rispondi

    A partire dalla versione 9.0 di PostgreSQL puoi usare l'apposita built-in function di aggregazione chiamanta string_agg, e la tua query diventerebbe pressapoco questa:

    SELECT company_id, string_agg(employee, ', ')
    FROM mytable
    GROUP BY company_id;

Rispondi

Per poter rispondere a questa domanda, devi essere registrato e loggato sul sito, dopodichè compila il box sottostante cercando di essere il più chiaro ed esauriente possibile, la tua risposta potrebbe essere la soluzione che l'utente cerca ed essere contrassegnata come migliore, consentendoti così di ottenere punti ed autorevolezza.

 Domanda Precedente

 Elenco Domande 

Domanda Successiva