如何在多列上聚合值?

时间:2018-04-18 14:01:02

标签: sql postgresql

我有一张如下表所示的表格:

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 个答案:

答案 0 :(得分:4)

CONCAT_WS功能应该在这里工作:

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

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

enter image description here

Demo

答案 1 :(得分:1)

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

Select col1 || col2;

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

如果您需要分隔符,可以使用concat_ws功能,“_ ws”表示“with_separator”

您可以找到完整的信息here

答案 2 :(得分: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)