Sql 如何知道a列是否包含所有空值

Sql 如何知道a列是否包含所有空值,sql,postgresql,null,Sql,Postgresql,Null,例如,如何知道所有列是否只包含空值 ID | col1 | col2 | col3 | col4 -----------+----------+-----------+-----------+----------- 1 | Null | Null |带值|带值 2 |带值|空|带值|带值 3 |带值| Null | Null | Null 4 |带值|空|带值|带值 5 |带值| Null | Null | Null 6 |空|空|空|空 7 |带值|空|带值|带值 8 |带值| Null |

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

ID | col1 | col2 | col3 | col4
-----------+----------+-----------+-----------+-----------
1 | Null | Null |带值|带值
2 |带值|空|带值|带值
3 |带值| Null | Null | Null
4 |带值|空|带值|带值
5 |带值| Null | Null | Null
6 |空|空|空|空
7 |带值|空|带值|带值
8 |带值| Null | Null | Null
只有
col2
为空,因此结果应仅为
col2

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

任何帮助都将不胜感激。

您将计算不为空的列:

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

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

计算非空的列:

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

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

为什么您希望所有的行都是空的列?你知道这些值是什么

此外,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;

为什么您希望所有列的所有行都
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;

查询结果集有一组已定义的列,独立于表内容。这是不可能的,因为在执行查询之前,必须知道结果所包含的列。如果
count(col)=0
,则该列只包含空值。如果
min(col)为空
max(col)为空
,则可以使用列名称作为字符串值的单行。查询结果集具有定义的列集,与表内容无关。这是不可能的,因为在执行查询之前,必须知道结果所包含的列。如果
count(col)=0
,则该列只包含null值。如果
min(col)为null
max(col)为null,则该列也可以工作。