SQL COUNT 统计 NULL 与空字符串 ‘‘ 差异(Oracle & Impala)

**摘要:**本文围绕 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,二者没有区别。

  1. COUNT(col):NULL 和''全都统计不到
  2. 统计字段为空(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 和空字符串'',二者是两类数据:

  1. COUNT(col):能统计'',不能统计 NULL
  2. 分开统计:

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 报表校验)

在金融监管报送的数据质量校验中,经常需要核查业务字段空值(如客户证件号、借据编号):

  1. Oracle 业务库:直接使用 COUNT(*) - COUNT(字段) 即可统计全部空记录,不用额外判断空字符串;
  2. Impala 数仓层:必须同时判断 IS NULL 和 ='',否则会漏掉空字符串数据,造成指标校验、勾稽关系出错。

一句话背诵版

COUNT (列名) 忽略 NULL;Oracle 中空串等于 NULL,空串和 NULL 都统计不到;Impala 区分空串和 NULL,空串可以被 COUNT (列名) 统计,NULL 不行。COUNT (*) 统计全量行,不受空值影响。

相关推荐
for_ever_love__1 小时前
MySQL 8.0 表设计规范:从业务建模、约束到索引评审的完整方法
数据库·mysql·表设计·建表规范
这个DBA有点耶1 小时前
ELT工具选型:ETL与ELT差异、CDC同步机制与主流工具对比`
数据库·数据仓库·sql·database·dba·etl·数据库管理员
ITxiaobing20231 小时前
自研 IP 库与 AppsFlyer 地理位置判定不一致,该如何排查?
网络·数据库·tcp/ip
玩AI的奶茶1 小时前
什么情况适合租算力?一张场景对照表,加三个自测问题
大数据·linux·服务器·数据库·人工智能·python
晴天¥1 小时前
Oracle Data Guard入门指南
数据库·oracle·oracle dg入门指南
tryxr1 小时前
聚簇索引、非聚簇索引与回表
数据库·sql·回表查询·聚簇查询·非聚簇查询
白熊--π2 小时前
读懂 Meta API 限流:从范围判断到工程优化
大数据·数据库·meta·facebook
Java爱好狂.2 小时前
Java小白如何三天速通redis?
java·数据库·redis·架构师·分布式锁·java面试·java程序员
菜鸟上路_lbz2 小时前
金仓数据库V9自增id报错
数据库