**摘要:**本文围绕 SQL 中 COUNT 函数对 NULL 与空字符串的统计差异展开,重点对比 Oracle 与 Impala/Hive 两类数据库的不同处理规则,并给出统计空值记录的具体 SQL 写法,最后结合金融监管 1104 报表校验场景说明实际应用要点。
核心结论
COUNT(字段名) 只统计字段不为 NULL 的数据 ,对空字符串''的识别逻辑随数据库不同而不同;COUNT(*) / COUNT(1) 统计整张表全部行数,不受 NULL、空字符串影响。
表格
| 数据库 | COUNT (列名) 是否统计 NULL | COUNT (列名) 是否统计 ''(空字符串) | 核心特点 |
|---|---|---|---|
| Oracle | ❌ 不统计 | ❌ 不统计 | Oracle 特殊规则:空字符串 '' 等价于 NULL |
| Impala/Hive | ❌ 不统计 | ✅ 可以统计 | 严格区分 NULL(未知)和空字符串 ''(长度为 0 的字符串) |
补充常量写法:
COUNT(NULL)结果永远返回 0;Oracle 中COUNT('')等价COUNT(NULL),结果同样为 0。
一、Oracle 场景(金融库常用)
Oracle 中空字符串''会隐式转换成 NULL,二者没有区别。
COUNT(col):NULL 和''全都统计不到- 统计字段为空(NULL / 空串)记录数量,两种写法:
sql
-- 写法1:总条数减去非空条数,简洁推荐
SELECT COUNT(*) - COUNT(col) AS null_cnt FROM table_name;
-- 写法2:CASE求和,可读性强
SELECT SUM(CASE WHEN col IS NULL THEN 1 ELSE 0 END) AS null_cnt FROM table_name;
⚠️ Oracle 不要写
col = ''判断空字符串,不会生效,统一使用IS NULL。
二、Impala / Hive 场景(数仓离线计算)
Impala 严格区分NULL 和空字符串'',二者是两类数据:
COUNT(col):能统计'',不能统计 NULL- 分开统计:
sql
-- 统计字段为NULL的行数
SELECT SUM(CASE WHEN col IS NULL THEN 1 ELSE 0 END) AS null_cnt FROM table_name;
-- 统计字段是空字符串''的行数
SELECT SUM(CASE WHEN col = '' THEN 1 ELSE 0 END) AS empty_str_cnt FROM table_name;
-- NULL 和空字符串合并统计
SELECT SUM(CASE WHEN col IS NULL OR col = '' THEN 1 ELSE 0 END) AS all_empty_cnt FROM table_name;
三、业务场景说明(适配监管 1104 报表校验)
在金融监管报送的数据质量校验中,经常需要核查业务字段空值(如客户证件号、借据编号):
- Oracle 业务库:直接使用
COUNT(*) - COUNT(字段)即可统计全部空记录,不用额外判断空字符串; - Impala 数仓层:必须同时判断 IS NULL 和 ='',否则会漏掉空字符串数据,造成指标校验、勾稽关系出错。
一句话背诵版
COUNT (列名) 忽略 NULL;Oracle 中空串等于 NULL,空串和 NULL 都统计不到;Impala 区分空串和 NULL,空串可以被 COUNT (列名) 统计,NULL 不行。COUNT (*) 统计全量行,不受空值影响。