如何简化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
相关产品推荐
相关产品推荐

