sql >> Databasteknik >  >> RDS >> PostgreSQL

Kan vi definiera en GROUP_CONCAT-funktion i PostgreSQL?

Det finns en string_agg() inbyggd som gör vad du vill, men du ber specifikt att den ska heta group_concat för MySQL-kompatibilitet. Tyvärr använder string_agg() en intern datatyp för ackumulering (förmodligen för att undvika att kopiera hela bufferten på varje tillägg, jag har dock inte tittat på källan) och jag hittade inget sätt att deklarera ett SQL-aggregat som är identiskt med string_agg( ).

Att definiera group_concat()-funktionen skulle inte heller fungera, eftersom pg måste göras medveten om att det är ett aggregat, inte en funktion med ett aggregat gömt inuti, vilket inte skulle fungera. En sådan funktion skulle fungera på en rad i taget:alla aggregat inuti skulle bara aggregera en enda rad och returnera den oförändrad...

Således kommer den här koden att samla elementen i en array och sedan lägga till "," avgränsare med array_to_string. Jag kommer att använda array_agg()-deklarationen (innan den blev en inbyggd) som modell, och helt enkelt lägga till en slutbehandlingsfunktion som konverterar den aggregerade arrayen till text.

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 fina är att det borde fungera bra för alla typer, utan krångel, tack vare de generiska typerna "anyarray" och "anyelement".

Jag skulle anta att detta skulle vara långsammare än string_agg() om string_agg verkligen undviker att kopiera hela aggregeringsmatrisen på varje tillägg. Detta bör dock endast ha betydelse om antalet rader som ska grupperas i varje uppsättning är stort. I det här fallet kan du förmodligen ägna en minut åt att redigera SQL-frågan;)

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



  1. formatera ett datumfält i mysql

  2. H2 databasfel i minnet Datakonverteringsfel vid konvertering när UUID används som primärnyckel

  3. Uppdatera en av 2 dubbletter i en sql-serverdatabastabell

  4. Filtyp Kontrollera för JPG, JPEG, PNG