如何用SQL按行统计任意表的NULL值(无需手动指定列)
按行统计任意表的NULL值(无需手动指定列名)
要实现无需手动指定列名、适配任意表的行级NULL值统计,核心思路是通过数据库的系统视图获取目标表的列名,动态拼接SQL语句计算每行的NULL数量。以下是主流数据库的具体实现方案:
MySQL/MariaDB 实现
利用information_schema.columns获取表的列信息,动态生成NULL计数表达式:
SET @table_name = 'tab'; SET @sql = NULL; -- 拼接每个列的NULL判断表达式 SELECT GROUP_CONCAT( CONCAT('IF(`', column_name, '` IS NULL, 1, 0)') SEPARATOR ' + ' ) INTO @null_count_expr FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = @table_name; -- 生成完整查询语句并执行 SET @sql = CONCAT( 'SELECT *, (', @null_count_expr, ') AS NULL_CNT FROM ', @table_name ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
PostgreSQL 实现
通过information_schema.columns获取列名,结合string_agg和动态执行语句实现:
DO $$ DECLARE table_name text := 'tab'; null_count_expr text; BEGIN -- 拼接NULL计数表达式 SELECT string_agg( format('(CASE WHEN %I IS NULL THEN 1 ELSE 0 END)', column_name), ' + ' ) INTO null_count_expr FROM information_schema.columns WHERE table_schema = current_schema() AND table_name = table_name; -- 动态执行查询 EXECUTE format( 'SELECT *, (%s) AS NULL_CNT FROM %I', null_count_expr, table_name ); END $$;
SQL Server 实现
使用sys.columns获取列信息,通过STRING_AGG拼接表达式后动态执行:
DECLARE @table_name NVARCHAR(128) = N'tab'; DECLARE @null_count_expr NVARCHAR(MAX); DECLARE @sql NVARCHAR(MAX); -- 生成NULL计数表达式 SELECT @null_count_expr = STRING_AGG( CONCAT('CASE WHEN ', QUOTENAME(name), ' IS NULL THEN 1 ELSE 0 END'), ' + ' ) FROM sys.columns WHERE object_id = OBJECT_ID(@table_name); -- 拼接并执行完整SQL SET @sql = CONCAT( 'SELECT *, (', @null_count_expr, ') AS NULL_CNT FROM ', @table_name ); EXEC sp_executesql @sql;
测试验证
以你提供的示例表为例,执行对应数据库的代码后,将得到如下结果:
+----+------+------+------+----------+ | ID | COL1 | COL2 | COL3 | NULL_CNT | +----+------+------+------+----------+ | 1 | a | b | c | 0 | | 2 | a | b | null | 1 | | 3 | a | null | null | 2 | | 4 | null | null | null | 3 | +----+------+------+------+----------+
内容的提问来源于stack exchange,提问作者Lukasz Szozda
相关产品推荐
相关产品推荐

