2009-04-15 7 views
0

Je suis arrivé à cette fonction concat champs dans mon pgSQL-serveur:PostgreSQL concaténation

 
BEGIN 
    IF acc IS NULL OR acc = '' THEN 
     RETURN instr; 
    ELSE 
     RETURN acc || ';' || instr; 
    END IF; 
    END; 

Il fonctionne très bien, mais maintenant je veux cette fonction à des entrées égales distinctes. Comment puis-je faire ceci?

+0

Veuillez fournir plus d'informations. En particulier, ce qui est acc? Qu'est-ce qu'un instr? Sont ces paramètres? Sont-ils les seuls champs/variables d'intérêt? –

Répondre

2
CREATE TYPE tp_concat AS (data TEXT[], delimiter TEXT); 

CREATE OR REPLACE FUNCTION group_concat_iterate(_state tp_concat, _value TEXT, delimiter TEXT, is_distinct boolean) 
    RETURNS tp_concat AS 
$BODY$ 
    SELECT 
    CASE 
     WHEN $1 IS NULL THEN ARRAY[$2] 
     WHEN $4 AND $1.data @> ARRAY[$2] THEN $1.data 
     ELSE $1.data || $2 
    END, 
    $3 
$BODY$ 
    LANGUAGE 'sql' VOLATILE; 

CREATE OR REPLACE FUNCTION group_concat_finish(_state tp_concat) 
    RETURNS text AS 
$BODY$ 
    SELECT array_to_string($1.data, $1.delimiter) 
$BODY$ 
    LANGUAGE 'sql' VOLATILE; 

CREATE AGGREGATE group_concat(text, text, boolean) (SFUNC = group_concat_iterate, STYPE = tp_concat, FINALFUNC = group_concat_finish); 

utiliser comme ceci:

SELECT GROUP_CONCAT(textfield, ';', TRUE) 
FROM mytable 

si vous ne voulez pas les doublons et

SELECT GROUP_CONCAT(textfield, ';', FALSE) 
FROM mytable 

si vous le faites.

+0

Voir: ['aggregate_name (expression DISTINCT)'] (http://www.postgresql.org/docs/8.4/static/sql-expressions.html) –

+0

@Mike: voir aussi la remarque sur 'DISTINCT' avec plusieurs arguments . – Quassnoi

+0

Ahh, c'est un point valable! –