PostgreSQL 9.0 of hoger:
Modern Postgres (sinds 2010) heeft de string_agg(expression, delimiter)
functie die precies doet wat de vrager zocht:
SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;
Postgres 9 heeft ook de mogelijkheid toegevoegd om een ORDER BY
te specificeren clausule in een geaggregeerde uitdrukking; anders moet u al uw resultaten bestellen of een ongedefinieerde bestelling afhandelen. Dus je kunt nu schrijven:
SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
FROM mytable
GROUP BY company_id;
PostgreSQL 8.4.x:
PostgreSQL 8.4 (in 2009) introduceerde de aggregatiefunctie array_agg(expression)
die de waarden in een array verzamelt. Dan array_to_string()
kan worden gebruikt om het gewenste resultaat te geven:
SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;
PostgreSQL 8.3.x en ouder:
Toen deze vraag oorspronkelijk werd gesteld, was er geen ingebouwde aggregatiefunctie om strings samen te voegen. De eenvoudigste aangepaste implementatie (aanbevolen door Vajda Gabo in deze mailinglijst, naast vele andere) is om de ingebouwde textcat
te gebruiken functie (die achter de ||
operator):
CREATE AGGREGATE textcat_all(
basetype = text,
sfunc = textcat,
stype = text,
initcond = ''
);
Hier is de CREATE AGGREGATE
documentatie.
Dit lijmt eenvoudig alle snaren aan elkaar, zonder scheidingsteken. Om een ", " ertussen te krijgen zonder deze aan het einde te hebben, wil je misschien je eigen aaneenschakelingsfunctie maken en deze vervangen door de "textcat" hierboven. Hier is er een die ik heb samengesteld en getest op 8.3.12:
CREATE FUNCTION commacat(acc text, instr text) RETURNS text AS $$
BEGIN
IF acc IS NULL OR acc = '' THEN
RETURN instr;
ELSE
RETURN acc || ', ' || instr;
END IF;
END;
$$ LANGUAGE plpgsql;
Deze versie voert een komma uit, zelfs als de waarde in de rij null of leeg is, dus je krijgt de volgende uitvoer:
a, b, c, , e, , g
Als u er de voorkeur aan geeft extra komma's te verwijderen om dit uit te voeren:
a, b, c, e, g
Voeg vervolgens een ELSIF
. toe controleer de functie als volgt:
CREATE FUNCTION commacat_ignore_nulls(acc text, instr text) RETURNS text AS $$
BEGIN
IF acc IS NULL OR acc = '' THEN
RETURN instr;
ELSIF instr IS NULL OR instr = '' THEN
RETURN acc;
ELSE
RETURN acc || ', ' || instr;
END IF;
END;
$$ LANGUAGE plpgsql;