La maggior parte dei principali RDBMS dispone di una funzione che ci consente di restituire i risultati delle query come un elenco separato da virgole.
Cioè, possiamo usare tale funzione per convertire ogni riga in un elemento di elenco separato, all'interno di un elenco separato da virgole.
Di seguito sono riportati esempi di come raggiungere questo obiettivo in alcuni dei più popolari RDBMS.
MySQL
MySQL ha il GROUP_CONCAT()
funzione che ci consente di generare i risultati della nostra query in un elenco separato da virgole:
SELECT GROUP_CONCAT(PetName)
FROM Pets;
Risultato:
Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow
Possiamo anche fare cose come rimuovere i valori duplicati (con il DISTINCT
clausola), specificare un ordine per i risultati (con il ORDER BY
clausola) e specificare un delimitatore diverso.
Vedi GROUP_CONCAT()
Funzione in MySQL per ulteriori esempi.
Database Oracle
Oracle Database ha il LISTAGG()
funzione:
SELECT LISTAGG(last_name, ', ')
FROM employees
WHERE job_id = 'IT_PROG';
Risultato:
Hunold, Ernst, Austin, Pataballa, Lorentz
Come MySQL, anche Oracle Database ci consente di rimuovere valori duplicati, specificare un ordine per i risultati, specificare un separatore diverso, ecc.
Vedi LISTAGG()
Funzione in Oracle per ulteriori esempi.
SQL Server
SQL Server ha il STRING_AGG()
funzione per restituire i nostri risultati in un elenco separato da virgole:
SELECT STRING_AGG(Genre, ',') AS Result FROM Genres
Risultato:
Rock,Jazz,Country,Pop,Blues,Hip Hop,Rap,Punk
Possiamo anche rimuovere valori duplicati, specificare un ordine per i risultati, modificare il delimitatore, ecc.
Per altri esempi, vedere Come restituire i risultati delle query come elenco separato da virgole in SQL Server.
MariaDB
Come MySQL, anche MariaDB ha un GROUP_CONCAT()
funzione:
SELECT GROUP_CONCAT(PetName)
FROM Pets;
Risultato:
Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow
Come l'omonima funzione di MySQL, possiamo anche fare cose come rimuovere i valori duplicati (con il DISTINCT
clausola), specificare un ordine per i risultati (con il ORDER BY
clausola), cambia il separatore, ecc.
Tuttavia, una cosa che MariaDB ha su MySQL è il LIMIT
clausola, che ci offre la possibilità di limitare il numero di risultati nell'elenco.
Vedi MariaDB GROUP_CONCAT()
per altri esempi.
PostgreSQL
Postgres ha il STRING_AGG()
funzione:
SELECT STRING_AGG(PetName, ',')
FROM Pets;
Risultato:
Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow
Possiamo anche rimuovere i valori duplicati (con il DISTINCT
clausola), specificare un ordine per i risultati (con il ORDER BY
clausola), cambia il separatore, ecc.
Vedi STRING_AGG()
Funzione in PostgreSQL per ulteriori esempi.
SQLite
In SQLite, possiamo usare GROUP_CONCAT()
funzione per trasformare i risultati della nostra query in un elenco separato da virgole:
SELECT group_concat(FirstName)
FROM Employee;
Risultato:
Andrew,Nancy,Jane,Margaret,Steve,Michael,Robert,Laura
Guarda come GROUP_CONCAT()
Funziona in SQLite per ulteriori esempi.
Più colonne
Gli esempi precedenti utilizzano tutti una singola colonna per l'elenco. Possiamo anche concatenare più colonne per produrre un elenco che includa più colonne.
Supponiamo di avere una tabella con i seguenti dati:
SELECT TaskId, TaskName
FROM Tasks;
Risultato:
TaskId TaskName ------ ------------ 1 Feed cats 2 Water dog 3 Feed garden 4 Paint carpet 5 Clean roof 6 Feed cats
In SQL Server possiamo fare quanto segue per generare entrambe le colonne in una singola riga:
SELECT STRING_AGG(CONCAT(TaskId, ') ', TaskName), ' ')
FROM Tasks
Risultato:
1) Feed cats 2) Water dog 3) Feed garden 4) Paint carpet 5) Clean roof 6) Feed cats