在 Hive 中NULL的理解

在 Hive 中,NULL 是一个特殊的值,表示"未知"或"缺失" 。任何与 NULL 的比较操作(如 =, >, <, >=, <=, <>)都会返回 NULL,而不是 TRUEFALSE


1. NULL 的比较规则

在 Hive(以及大多数 SQL 数据库)中,NULL 的比较遵循 三值逻辑(Three-Valued Logic)

  • TRUE
  • FALSE
  • UNKNOWN(即 NULL

任何与 NULL 的比较结果都是 UNKNOWN(即 NULL


2. 具体示例

假设有一个表 test

value
5
NULL
3
2.1 NULL > 1 返回什么?
sql 复制代码
SELECT value, value > 1 AS result FROM test;

结果:

value result
5 true
NULL NULL
3 true
  • NULL > 1NULL(未知)
  • NULL < 1NULL
  • NULL = 1NULL
  • NULL <> 1NULL
2.2 NULL = NULL 返回什么?
sql 复制代码
SELECT NULL = NULL AS result;

结果: NULL(不是 true!)

  • 在 SQL 中,NULL 不等于任何值,包括它自己。
  • 要判断两个值是否都为 NULL,必须用 IS NULL
2.3 IS NULLIS NOT NULL
sql 复制代码
SELECT value, value IS NULL AS is_null FROM test;

结果:

value is_null
5 false
NULL true
3 false
  • IS NULL 是唯一能正确判断 NULL 的操作。

3. WHERE 子句中的 NULL 行为

sql 复制代码
SELECT * FROM test WHERE value > 1;

结果:

value
5
3
  • NULL 被过滤掉了!因为 NULL > 1 返回 NULL,而 WHERE 只保留 TRUE 的行。

如果你想保留 NULL,必须显式判断:

sql 复制代码
SELECT * FROM test WHERE value > 1 OR value IS NULL;

4. NULL 的逻辑运算

  • TRUE AND NULLNULL
  • FALSE AND NULLFALSE
  • TRUE OR NULLTRUE
  • FALSE OR NULLNULL
  • NOT NULLNULL

5. 如何正确处理 NULL

5.1 使用 IS NULL / IS NOT NULL
sql 复制代码
SELECT * FROM test WHERE value IS NULL;
5.2 使用 COALESCE 提供默认值
sql 复制代码
SELECT COALESCE(value, 0) AS safe_value FROM test;
5.3 使用 NVL(Hive 特有)
sql 复制代码
SELECT NVL(value, 0) AS safe_value FROM test;
5.4 使用 CASE WHEN
sql 复制代码
SELECT 
    CASE 
        WHEN value IS NULL THEN 'Missing'
        WHEN value > 1 THEN 'Large'
        ELSE 'Small'
    END AS category
FROM test;

6. 总结

操作 结果
NULL > 1 NULL
NULL = NULL NULL
value IS NULL TRUE/FALSE
WHERE value > 1 过滤掉 NULL
COALESCE(value, default) 提供默认值

核心原则

  • NULL 不等于任何值,包括它自己。
  • 任何与 NULL 的比较都返回 NULL
  • 必须用 IS NULL 判断空值。

如需处理复杂空值逻辑,建议结合 COALESCECASE WHEN 等函数。

相关推荐
yumgpkpm1 天前
数据可视化AI、BI工具,开源适配 Cloudera CMP 7.3(或类 CDP 的 CMP 7.13 平台,如华为鲲鹏 ARM 版)值得推荐?
人工智能·hive·hadoop·信息可视化·kafka·开源·hbase
二进制_博客1 天前
使用datax将mysql数据抽取到hive分区表无数据
数据库·hive·mysql
干就完事了1 天前
Hive视图
数据仓库·hive·hadoop
Linux Huang1 天前
【Dinky】IDEA运行出现HistoryServer异常
java·hadoop·flink·intellij idea
A尘埃1 天前
Hive基于Hadoop的数据仓库工具
数据仓库·hive·hadoop
Macbethad2 天前
使用WPF编写一个多维度伺服系统的程序
大数据·hadoop·wpf
百***35942 天前
从0到1部署Tomcat和添加servlet(IDEA2024最新版详细教程)
hive·servlet·tomcat
howard20052 天前
5.2 Hive插入数据实战
hive·插入数据
杂家2 天前
Hive on Spark && Spark on Hive配置
大数据·数据仓库·hive·hadoop·spark
沧海寄馀生2 天前
Apache Hadoop生态组件部署分享-Hadoop
大数据·hadoop·分布式·apache