sql >> Database teknologi >  >> RDS >> PostgreSQL

Kan vi definere en GROUP_CONCAT funktion i PostgreSQL?

Der er en string_agg() indbygget, som gør, hvad du vil, men du beder specifikt om at få navnet group_concat for MySQL-kompatibilitet. Desværre bruger string_agg() en intern datatype til akkumulering (formodentlig for at undgå at kopiere hele bufferen på hver append, jeg har dog ikke kigget på kilden), og jeg fandt ikke en måde at erklære et SQL-aggrerate identisk med string_agg( ).

At definere group_concat()-funktionen ville heller ikke fungere, da pg skal gøres opmærksom på, at det er et aggregat, ikke en funktion med et aggregat skjult inde, som ikke ville fungere. En sådan funktion ville fungere på en række ad gangen:ethvert aggregat indeni ville blot samle en enkelt række og returnere det uændret...

Således vil denne kode akkumulere elementerne i et array, og derefter tilføje "," afgrænserne med array_to_string. Jeg vil bruge array_agg()-deklarationen (før den blev en indbygget) som en model, og jeg tilføjer blot en færdiggørelsesfunktion, som vil konvertere det aggregerede array til tekst.

CREATE OR REPLACE FUNCTION _group_concat_finalize(anyarray)
RETURNS text AS $$
    SELECT array_to_string($1,',')
$$ IMMUTABLE LANGUAGE SQL;

CREATE AGGREGATE group_concat(anyelement) (
   SFUNC=array_append,
   STYPE=anyarray,
   FFUNC=_group_concat_finalize,
   INITCOND='{}'
);

SELECT group_concat(x) FROM foo;

Det gode er, at det burde fungere fint til enhver type, uden besvær, takket være de generiske typer "anyarray" og "anyelement".

Jeg vil antage, at dette ville være langsommere end string_agg(), hvis string_agg faktisk undgår at kopiere hele aggregeringsarrayet på hver append. Dette bør dog kun have betydning, hvis antallet af rækker, der skal grupperes i hvert sæt, er stort. I dette tilfælde kan du sandsynligvis bruge et minut på at redigere SQL-forespørgslen;)

http://sqlfiddle.com/#!17/c452d/1



  1. dynamisk sql-forespørgsel i postgres

  2. Brug af alarmer og operatører i SQL Server

  3. Hvordan får man søgemaskiner til at indeksere databasedrevet indhold?

  4. ORA-00942:Kan du vælge fra schema.table, men ikke tabel?