我有一张如下表所示的表格:
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
值是字符串。有没有人知道如何实现这个目标?
提前致谢。
答案 0 :(得分:4)
CONCAT_WS
功能应该在这里工作:
SELECT
CONCAT_WS(',', column1, column2, column3, ..., column_n) AS result
FROM yourTable;
NULL
值将自动从生成的CSV输出中删除。
答案 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)