Postgresql GROUP_CONCAT equivalent?

后端 未结 7 2143
清酒与你
清酒与你 2020-11-22 03:04

I have a table and I\'d like to pull one row per id with field values concatenated.

In my table, for example, I have this:

TM67 | 4  | 32556
TM67 | 9         


        
相关标签:
7条回答
  • 2020-11-22 03:39

    My sugestion in postgresql

    SELECT cpf || ';' || nome || ';' || telefone  
    FROM (
          SELECT cpf
                ,nome
                ,STRING_AGG(CONCAT_WS( ';' , DDD_1, TELEFONE_1),';') AS telefone 
          FROM (
                SELECT DISTINCT * 
                FROM temp_bd 
                ORDER BY cpf DESC ) AS y
          GROUP BY 1,2 ) AS x   
    
    0 讨论(0)
  • 2020-11-22 03:41

    Since 9.0 this is even easier:

    SELECT id, 
           string_agg(some_column, ',')
    FROM the_table
    GROUP BY id
    
    0 讨论(0)
  • 2020-11-22 03:47

    and the version to work on the array type:

    select
      array_to_string(
        array(select distinct unnest(zip_codes) from table),
        ', '
    );
    
    0 讨论(0)
  • 2020-11-22 03:57
    SELECT array_to_string(array(SELECT a FROM b),', ');
    

    Will do as well.

    0 讨论(0)
  • 2020-11-22 03:59

    This is probably a good starting point (version 8.4+ only):

    SELECT id_field, array_agg(value_field1), array_agg(value_field2)
    FROM data_table
    GROUP BY id_field
    

    array_agg returns an array, but you can CAST that to text and edit as needed (see clarifications, below).

    Prior to version 8.4, you have to define it yourself prior to use:

    CREATE AGGREGATE array_agg (anyelement)
    (
        sfunc = array_append,
        stype = anyarray,
        initcond = '{}'
    );
    

    (paraphrased from the PostgreSQL documentation)

    Clarifications:

    • The result of casting an array to text is that the resulting string starts and ends with curly braces. Those braces need to be removed by some method, if they are not desired.
    • Casting ANYARRAY to TEXT best simulates CSV output as elements that contain embedded commas are double-quoted in the output in standard CSV style. Neither array_to_string() or string_agg() (the "group_concat" function added in 9.1) quote strings with embedded commas, resulting in an incorrect number of elements in the resulting list.
    • The new 9.1 string_agg() function does NOT cast the inner results to TEXT first. So "string_agg(value_field)" would generate an error if value_field is an integer. "string_agg(value_field::text)" would be required. The array_agg() method requires only one cast after the aggregation (rather than a cast per value).
    0 讨论(0)
  • 2020-11-22 04:00

    Try like this:

    select field1, array_to_string(array_agg(field2), ',')
    from table1
    group by field1;
    
    0 讨论(0)
提交回复
热议问题