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 值。

  1. SET ANSI_NULLS OFF

例外

HIVE 中,空字符串不能用 NULL 来做判断,数值可以。
对于空字符串,应该用 != ‘’ 或 length(value) <> 0 来判断。

参考