首页 > 解决方案 > 在 PostgreSQL 中为给定行选择所有具有 NOT NULL 值的列

问题描述

我有一个带有 id、A、B、C、D 列的表。每行都有一个唯一的 A、B、C、D 列的 NOT NULL 值:对于 id=1 的行,它是:A、C、D;对于 id = 2 的行,它是:B,C,依此类推。我在编写 SQL 脚本时需要帮助,该脚本将为每个给定行返回一个包含 NOT NULL 值的列列表。就像是:

SELECT NOT_NULL_Columns FROM table WHERE id=1;

预期结果是一个只有一行、列名和相应(非空)值的表

标签: sqlpostgresql

解决方案


SQL 查询不可能返回可变数量的列,因此我假设您想要具有非空值的列的名称。

你可以做:

select *,
  case when a is not null then 'A ' else '' end ||
  case when b is not null then 'B ' else '' end ||
  case when c is not null then 'C ' else '' end ||
  case when d is not null then 'D ' else '' end as not_null_columns
from t

结果:

 id  a     b     c  d     not_null_columns 
 --- ----- ----- -- ----- ---------------- 
 1   7     null  7  7     A C D            
 2   null  7     7  null  B C              
 3   null  7     7  7     B C D            

请参阅DB Fiddle上的运行示例。

现在,如果您想要非空,那就另当别论了。由于 SQL 无法生成可变数量的列,因此解决方案可以将所有非空值组合成一个结构,例如数组、XML 文档、JSON 文档,甚至是字符串。


推荐阅读