You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化SQL中判断所有列均为NULL的查询语句?

筛选所有列均为NULL的行的简洁写法

静态SQL方案

不同数据库有不同的简洁实现方式,以下是主流数据库的具体写法:

PostgreSQL

直接利用整行判断逻辑,这是最简洁的原生方案:

SELECT d
FROM database d
WHERE row(d.*) IS NULL;

当且仅当行内所有列的值都是NULL时,row(d.*) IS NULL才会返回true。

MySQL/MariaDB

可以通过COALESCE函数简化条件写法,相比原查询更紧凑:

SELECT d
FROM database d
WHERE COALESCE(c1, c2, c3, c4, c5, c6) IS NULL;

COALESCE会返回第一个非NULL的列值,若所有列都是NULL,结果即为NULL。

如果想彻底避免手动列出所有列,可使用动态SQL自动生成查询条件:

SET @table_name = 'database';
SET @where_clause = (
  SELECT GROUP_CONCAT(column_name, ' IS NULL SEPARATOR ' AND ')
  FROM information_schema.columns
  WHERE table_schema = DATABASE() AND table_name = @table_name
);
SET @sql = CONCAT('SELECT * FROM ', @table_name, ' WHERE ', @where_clause);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQL Server

可以借助JSON函数判断整行是否无有效数据,或用动态SQL生成条件:

-- 方法1:JSON函数判断
SELECT d
FROM database d
WHERE (SELECT COUNT(*) FROM OPENJSON(CAST((SELECT d.* FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) AS NVARCHAR(MAX)))) = 0;

-- 方法2:动态SQL
DECLARE @table_name NVARCHAR(128) = 'database';
DECLARE @where_clause NVARCHAR(MAX);
SELECT @where_clause = STRING_AGG(QUOTENAME(column_name) + ' IS NULL', ' AND ')
FROM information_schema.columns
WHERE table_schema = SCHEMA_NAME() AND table_name = @table_name;

DECLARE @sql NVARCHAR(MAX) = CONCAT('SELECT * FROM ', QUOTENAME(@table_name), ' WHERE ', @where_clause);
EXEC sp_executesql @sql;

说明

  • 静态SQL里,PostgreSQL的整行判断是最简洁的原生方案;其他数据库若想彻底避免手动列全列,只能依赖动态SQL读取系统表自动生成条件。
  • 使用动态SQL时需注意权限,确保执行用户有读取对应系统视图(如information_schema.columns)的权限。

内容的提问来源于stack exchange,提问作者Tindona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:20:36