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

如何在SQL中循环指定列生成对应空值查询语句?

纯SQL实现遍历列生成空值查询方案

方法1:通过UNION ALL合并多列结果(带列标识)

如果需要一次性获取所有目标列的空值记录,同时明确标记每条记录来自哪一列,可以用UNION ALL拼接多个查询:

SELECT 'A' AS null_source_column, * FROM table_name WHERE `A` IS NULL
UNION ALL
SELECT 'B' AS null_source_column, * FROM table_name WHERE `B` IS NULL
UNION ALL
SELECT 'C' AS null_source_column, * FROM table_name WHERE `C` IS NULL;

这个查询会返回所有在A、B、C列上为空的行,新增的null_source_column字段会告诉你当前行是因为哪一列为空被筛选出来的。

方法2:用存储过程循环执行单条查询

如果需要分别执行每个列的查询(每次返回对应列的独立结果集),可以创建存储过程来遍历列名并动态执行SQL:

DELIMITER //
CREATE PROCEDURE FetchNullRecordsByColumn()
BEGIN
    DECLARE col_names TEXT DEFAULT 'A,B,C';
    DECLARE current_col VARCHAR(20);
    DECLARE comma_pos INT;

    WHILE col_names != '' DO
        -- 拆分出当前列名
        SET comma_pos = LOCATE(',', col_names);
        IF comma_pos = 0 THEN
            SET current_col = col_names;
            SET col_names = '';
        ELSE
            SET current_col = LEFT(col_names, comma_pos - 1);
            SET col_names = RIGHT(col_names, LENGTH(col_names) - comma_pos);
        END IF;

        -- 构造并执行动态查询
        SET @dynamic_sql = CONCAT('SELECT * FROM table_name WHERE `', current_col, '` IS NULL;');
        PREPARE stmt FROM @dynamic_sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END WHILE;
END //
DELIMITER ;

调用存储过程即可依次获取各列的空值结果集:

CALL FetchNullRecordsByColumn();

注意事项

  • 方法1适合批量查看所有结果,方法2适合单独获取每一列的结果集
  • 动态SQL中用反引号包裹列名,避免列名与SQL关键字冲突
  • 上述代码基于MySQL编写,其他数据库(如PostgreSQL、SQL Server)的语法会有差异,但核心逻辑(遍历列名+动态执行)通用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:27:38