Ce face group_concat / string_agg
group_concat(x) este o funcție de agregare: pentru fiecare grup din GROUP BY (sau pentru tot tabelul) întoarce un text cu toate valorile lui x lipite între ele. Separatorul implicit este virgula (,); al doilea argument alege alt separator. Valorile NULL sunt sărite.
string_agg(x, separator) există din SQLite 3.44.0 și face același lucru, cu numele din PostgreSQL și SQL Server; la ea separatorul este obligatoriu. Tot din 3.44.0 poți scrie ORDER BY în interiorul apelului ca să alegi ordinea valorilor. Fără el, ordinea este cea în care SQLite citește rândurile și nu este garantată.
group_concat(DISTINCT x) elimină dublurile, dar în SQLite o agregare cu DISTINCT poate avea un singur argument, deci nu poți alege separatorul în același timp. Echivalentul din MySQL este GROUP_CONCAT cu sintaxa SEPARATOR, care în SQLite nu există.
Parametri
| Parametru | Descriere |
|---|---|
x |
Valoarea lipită din fiecare rând; NULL este ignorat. |
separator |
Textul pus între valori; implicit ',' la group_concat. |
ORDER BY y |
Opțional (3.44.0+): ordinea în care sunt lipite valorile. |
Ce returnează
Un text, sau NULL dacă grupul nu are nicio valoare nenulă.
Exemple
Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.
CREATE TABLE inscrieri (
elev TEXT NOT NULL,
curs TEXT NOT NULL,
oras TEXT NOT NULL
);
INSERT INTO inscrieri VALUES
('Mihai', 'Python', 'Iași'),
('Ana', 'Python', 'Iași'),
('Elena', 'SQL', 'Cluj'),
('Ana', 'SQL', 'Iași'),
('Dan', 'Python', 'Cluj');
Exemplul 1: Elevii fiecărui curs
Separatorul implicit este virgula fără spațiu. ORDER BY elev în interiorul apelului face lista alfabetică.
SELECT curs,
group_concat(elev ORDER BY elev) AS elevi,
COUNT(*) AS numar
FROM inscrieri
GROUP BY curs
ORDER BY curs;
Rezultat
╭────────┬───────────────┬───────╮
│ curs │ elevi │ numar │
╞════════╪═══════════════╪═══════╡
│ Python │ Ana,Dan,Mihai │ 3 │
│ SQL │ Ana,Elena │ 2 │
╰────────┴───────────────┴───────╯
Exemplul 2: string_agg cu separator ales
Pentru fiecare elev, cursurile sunt lipite cu ' + '. Rezultatul este identic cu group_concat(curs, ' + ' ORDER BY curs).
SELECT elev, string_agg(curs, ' + ' ORDER BY curs) AS cursuri
FROM inscrieri
GROUP BY elev
ORDER BY elev;
Rezultat
╭───────┬──────────────╮
│ elev │ cursuri │
╞═══════╪══════════════╡
│ Ana │ Python + SQL │
│ Dan │ Python │
│ Elena │ SQL │
│ Mihai │ Python │
╰───────┴──────────────╯
Exemplul 3: Valori unice cu DISTINCT
Fără DISTINCT, Iași ar apărea de două ori la Python. Cu DISTINCT nu poți da separator, așa că rămâne virgula.
SELECT curs, group_concat(DISTINCT oras) AS orase
FROM inscrieri
GROUP BY curs
ORDER BY curs;
Rezultat
╭────────┬───────────╮
│ curs │ orase │
╞════════╪═══════════╡
│ Python │ Iași,Cluj │
│ SQL │ Cluj,Iași │
╰────────┴───────────╯
Greșeli frecvente
- Copiezi sintaxa MySQL
GROUP_CONCAT(x SEPARATOR '; '). În SQLite separatorul este al doilea argument:group_concat(x, '; '). - Scrii
group_concat(DISTINCT x, '; '). SQLite răspunde „DISTINCT aggregates must have exactly one argument”; elimină dublurile într-o subinterogare cuSELECT DISTINCTși apoi aplicăgroup_concat(x, '; '). - Te bazezi pe ordinea valorilor fără
ORDER BYîn apel. Ordinea poate să se schimbe după un index nou sau dupăVACUUM.
Comenzi înrudite
json_group_array / json_group_object: Funcții de agregare care adună valorile dintr-un grup de rânduri într-un tablou sau obiect JSON, gata de trimis unui API.ROW_NUMBER, RANK, LAG (funcții fereastră): Calculează pentru fiecare rând un număr de ordine, un loc în clasament sau valoarea din rândul vecin, fără să grupeze rândurile.WITH (CTE): Dă un nume unei subinterogări (Common Table Expression) și o folosește apoi ca pe un tabel, ca interogarea să fie mai ușor de citit.
Întrebări & Exemple de Cod:
group_concat / string_aggAi o nelămurire despre utilizarea comenzii
group_concat / string_aggsau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.