【问题标题】:How to know if the a column contains all NULLs如何知道 a 列是否包含所有 NULL
【发布时间】:2019-01-28 07:21:57
【问题描述】:

如何知道所有列是否只包含空值,例如

ID         | col1     | col2      |col3       | col4     
-----------+----------+-----------+-----------+-----------
 1         | Null     |Null       | with value| with value
 2         |with value|Null       | with value| with value
 3         |with value|Null       | Null      | Null    
 4         |with value|Null       | with value| with value
 5         |with value|Null       | Null      | Null  
 6         |Null      |Null       | Null      | Null    
 7         |with value|Null       | with value| with value
 8         |with value|Null       | Null      | Null  

只有col2 是NULL,所以结果应该是col2

ID         | col2     |
-----------+----------+
 1         |Null      |
 2         |Null      |
 3         |Null      |
 4         |Null      |
 5         |Null      |
 6         |Null      |
 7         |Null      |
 8         |Null      | 

任何帮助将不胜感激。

【问题讨论】:

  • 查询结果集有一组已定义的列,与表内容无关。
  • 这是不可能的,因为在查询执行之前必须知道结果的列。您可以实现的是将列名称作为字符串值的单行
  • 如果count(col) = 0,该列只包含空值。
  • 如果 min(col) is nullmax(col) is null 也有效。

标签: sql postgresql null


【解决方案1】:

你计算不为 NULL 的列:

SELECT 0 = count(col1) AS col1_all_null,
       0 = count(col2) AS col2_all_null,
       ...
FROM mytable;

这利用了聚合函数忽略 NULL 值的事实(嗯,至少几乎所有)。

【讨论】:

    【解决方案2】:

    为什么要所有列的所有行都是NULL?你知道价值观是什么。

    此外,SQL 查询只能返回一组固定的列,因此您无法过滤这些列。如果您只想要所有值为NULL 的列名的列表,您可以将这些名称连接在一起:

    select concat_ws(',',
                     (case when count(col1) = 0 then 'col1' end),
                     (case when count(col2) = 0 then 'col2' end),
                     (case when count(col3) = 0 then 'col3' end)
                    )
    from t;
    

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多