在 Hive 中,NULL 是一个特殊的值,表示"未知"或"缺失" 。任何与 NULL 的比较操作(如 =, >, <, >=, <=, <>)都会返回 NULL,而不是 TRUE 或 FALSE。
1. NULL 的比较规则
在 Hive(以及大多数 SQL 数据库)中,NULL 的比较遵循 三值逻辑(Three-Valued Logic):
TRUEFALSEUNKNOWN(即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 > 1→NULL(未知)NULL < 1→NULLNULL = 1→NULLNULL <> 1→NULL
2.2 NULL = NULL 返回什么?
sql
SELECT NULL = NULL AS result;
结果: NULL(不是 true!)
- 在 SQL 中,
NULL不等于任何值,包括它自己。 - 要判断两个值是否都为
NULL,必须用IS NULL。
2.3 IS NULL 和 IS 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 NULL→NULLFALSE AND NULL→FALSETRUE OR NULL→TRUEFALSE OR NULL→NULLNOT NULL→NULL
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判断空值。
如需处理复杂空值逻辑,建议结合 COALESCE、CASE WHEN 等函数。