sql - 在 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;
预期结果是一个只有一行、列名和相应(非空)值的表
解决方案
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 文档,甚至是字符串。
推荐阅读
- swift - 使用正则表达式将连字符插入长度受限的字符串中
- python - 根据其他列条件更新列
- javascript - JQuery 需要 2 次点击而不是 1 次
- html - 如何阻止字段从其父元素继承 ng-touched 类
- json - Testcafe - 如何读取 json 响应并在选择器中输入值
- android-studio - 解释 Android Studio 控制台输出格式以及如何配置以在每一行中显示日期/时间?
- ffmpeg - 如何让 ffmpeg 编码一次并复用两次,以及选项?
- python-3.x - 图像处理错误:模块“PIL.Image”没有属性“ImageWin”和“ImageDraw”
- mysql - 如果在另一个表上匹配,则从一个表中排除行 - MySql
- terraform - 将资源导入 terraform 模块的问题