TL; DR
尽量都使用 IS / IS NOT 来判断 NULL。
原理
NULL 用“=/!=/<>”运算符的效果,有两套实现流派。
- ANSI 标准:“NULL = NULL” = FALSE// 我个人推测为“ NULL 不可比较”。
- 非 ANSI 标准:“NULL = NULL” = TRUE// 我个人推测为“ NULL 可以比较”。
但对于 IS / IS NOT 的实现效果是统一的。
举例
表格:table
id | value |
---|---|
1 | 99 |
2 | NULL |
3 | 77 |
那么有:
语句 / 标准 | ANSI | 非 ANSI |
---|---|---|
SELECT value FROM table WHERE value = NULL | 无结果 | 2 |
SELECT value FROM table WHERE value != NULL | 无结果 | 1、3 |
SELECT value FROM table WHERE value IS NULL | 2 | 2 |
SELECT value FROM table WHERE value IS NOT NULL | 1、3 | 1、3 |
某些情况下可以通过这个语句,注明不按照 ANSI 标准做处理,从而在遵照 ANSI 标准的系统中,用 = / != / <> 比对 NULL 值。
SET ANSI_NULLS OFF
例外
HIVE 中,空字符串不能用 NULL 来做判断,数值可以。
对于空字符串,应该用 != ‘’ 或 length(value) <> 0 来判断。