首页/数据/数据工程与 ETL 速查/空值检测 SQL 模板

空值检测 SQL 模板

空值检测按字段批量输出空值行数与空值率,并按表汇总成稽核结果,便于趋势对比;关键字段(主键、金额、时间)建议设严格阈值。

空值检测是什么

空值检测按字段批量统计 NULL 行数与空值率,把结果按天写入稽核表,用于趋势对比与阈值告警。它属于数据质量中的完整性维度:主键、金额、时间这类关键字段应接近零空值,业务上确实可空的字段则设上限。检测本身只是一条 SQL,真正的价值在于把「哪个字段允许为空」写进数据字典,规则才可被判对错。

基本信息

检测对象主键、外键、金额、时间、状态等关键字段
输出总行数、各字段空值行数、空值率、检测时间
阈值关键字段 0 容忍;可空字段设比例上限并按天波动判断
落库写入稽核结果表,供看板展示与趋势对比
判定口径以数据字典中「是否允许为空」为唯一标准

典型使用场景

  • 上线前验收:新表接入时核对关键字段是否有大规模空值
  • 日常稽核:每日对核心表执行,形成空值率趋势基线
  • 上游关联失败排查:维表关联不上时先看关联键空值率是否突增
  • 口径治理:把长期为空的字段标记为废弃或补齐来源
  • 变更回归:上游加字段或改类型后,复跑同一套检测确认无回归

多字段空值检测

多字段空值检测
-- 一次扫描输出多个字段的空值情况,避免多次全表扫描
SELECT COUNT(1) AS total_cnt,
       SUM(CASE WHEN order_id   IS NULL THEN 1 ELSE 0 END) AS null_order_id,
       SUM(CASE WHEN user_id    IS NULL THEN 1 ELSE 0 END) AS null_user_id,
       SUM(CASE WHEN pay_amount IS NULL THEN 1 ELSE 0 END) AS null_pay_amount,
       ROUND(SUM(CASE WHEN pay_amount IS NULL THEN 1 ELSE 0 END) / COUNT(1), 4) AS null_pay_rate
FROM dwd_trade_order_detail_di
WHERE dt = '2026-10-11';
-- 空字符串与 NULL 是两回事,业务上等价时需一并统计
SELECT SUM(CASE WHEN TRIM(COALESCE(user_name, '')) = '' THEN 1 ELSE 0 END) AS blank_user_name
FROM dwd_trade_order_detail_di WHERE dt = '2026-10-11';

写入稽核表并比对趋势

写入稽核表并比对趋势
-- 每日检测结果落表,保留历史用于趋势与突增判断
INSERT OVERWRITE TABLE dq_check_result PARTITION (dt = '2026-10-11')
SELECT 'dwd_trade_order_detail_di' AS table_name,
       'null_pay_rate' AS rule_name,
       ROUND(SUM(CASE WHEN pay_amount IS NULL THEN 1 ELSE 0 END) / COUNT(1), 4) AS rule_value,
       CURRENT_TIMESTAMP AS check_time
FROM dwd_trade_order_detail_di WHERE dt = '2026-10-11';

-- 与近 7 天均值对比,涨幅超过阈值即告警
SELECT dt, rule_value
FROM dq_check_result
WHERE rule_name = 'null_pay_rate' AND dt >= DATE_SUB(CURRENT_DATE, 7)
ORDER BY dt;

阈值设定参考

字段类型期望空值率超阈值处理
主键、明细序号0立即阻断下游并回溯上游写入
关联键(外键、商品号)0 或接近 0先修复映射再放行,否则关联后指标失真
金额、数量0按业务确认是否可用 0 替代,禁止静默填充
时间字段0缺失时间的记录无法参与时效与口径计算
业务可空字段(备注等)设上限,如 30%观察趋势,突增时报警不阻断
COUNT(字段) 会自动跳过 NULL,用它统计总数再相减容易得出「没有空值」的错误结论;判断是否存在空值请用 COUNT(1) - COUNT(字段) 或 SUM(CASE ...)。

易错点

  • 用 COUNT(字段) 与 COUNT(1) 的差值算空值数,分子分母口径混乱,空值率算错
  • 分区分母误用整表行数而非当日分区行数,空值率被稀释,真实问题被掩盖
  • 只统计 NULL 不看空字符串与全空格,字段实际为空却报告正常
  • 同一规则每天全表扫描多字段,未做分区裁剪与合并扫描,稽核本身成为集群负担
  • 检测结果只告警不落库,无法做趋势对比,突增和长期缓慢恶化都发现不了

数据来源与参考

  • 行业数据质量稽核实践
  • DAMA-DMBOK 完整性维度
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌