sql >> Database >  >> RDS >> PostgreSQL

Hoe tekenreeksen van een tekenreeksveld samenvoegen in een PostgreSQL 'groeperen op'-query?

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;


  1. Toegang geweigerd voor gebruiker 'root'@'localhost' met PHPMyAdmin

  2. 5 manieren om de fout "Delen door nul" in SQL Server op te lossen (Msg 8134)

  3. MySQL versus PostgreSQL voor webapplicaties

  4. Een database herstellen in SQL Server 2017