首页 文章

如何在多列上聚合值?

提问于
浏览
0

我有一个如下所示的表:

column1 | column2 | column3 | .... | column_n
----------------------------------------------
null    | null    | val     | .... | null
val     | null    | null    | .... | null
null    | val1    | null    | .... | val2

我想获得一个聚合不同列的所有值的查询结果 . 非空值的范围在0和2之间,其中1是常见情况,0或2是边缘情况 . 结果应如下所示:

column1 | column2 | column3 | .... | column_n | result
-------------------------------------------------------
null    | null    | val     | .... | null     | val
val     | null    | null    | .... | null     | val
null    | val1    | null    | .... | val2     | val1, val2

值是字符串 . 有没有人知道如何实现这一目标?

提前致谢 .

3 回答

  • 4

    CONCAT_WS 函数应该在这里工作:

    SELECT
        CONCAT_WS(',', column1, column2, column3, ..., column_n) AS result
    FROM yourTable;
    

    NULL 值将自动从生成的CSV输出中删除 .

    演示

  • 1

    如果表具有主键( id ),则可以在通用解决方案中使用jsonb . 您不必知道其他列的数量和名称:

    drop table if exists my_table;
    create table my_table(id int primary key, col1 text, col2 text, col3 text);
    insert into my_table values
        (1, 'alfa', null, null),
        (2, null, null, null),
        (3, 'alfa', null, 'beta');
    
    select t.*, string_agg(value, ', ') as result
    from my_table t
    left join jsonb_each_text(to_jsonb(t)- 'id') on value is not null
    group by id;
    
     id | col1 | col2 | col3 |   result   
    ----+------+------+------+------------
      1 | alfa |      |      | alfa
      2 |      |      |      | 
      3 | alfa |      | beta | alfa, beta
    (3 rows)
    
  • 1

    要使用PostgreSQL聚合列,可以使用 || 运算符:

    Select col1 || col2;
    

    另一种解决方案,您可以使用 concat 函数,但忽略 NULL 值 .

    如果需要分隔符,可以使用 concat_ws 函数,"_ws"表示"with_separator"

    你可以找到完整的信息here

相关问题