数据库里null值的比较是一件非常坑爹事情,一不小心就会掉到陷阱里去。以一个非常常见的场景为例:
SELECT * FROM some_table WHERE field1 = field2
看上去没什么问题吧。错了!如果field1、field2中有一个值为null,那么结果就会变得很神奇。
下面列出各种情况,你可以先不看答案,看看你能猜对几个
SQL | 结果 |
---|---|
select 1 from dual where null=null | 什么都没有 |
select 1 from dual where null<>null | 什么都没有 |
select 1 from dual where 1=null | 什么都没有 |
select 1 from dual where 1<>null | 什么都没有 |
看到没有,你不能拿null用来做比较,即使是拿null和null比。一旦你怎么做,其结果肯定是false。
正确的做法
如果你要对(可能会对)null值做比较,安全且正确的做法是使用nvl
SELECT * FROM some_table WHERE nvl(field1, null_if_value)=nvl(field2, null_if_value)
就如上面的
SQL | 结果 |
---|---|
select 1 from dual where nvl(null,-1)=nvl(null,-1) | 1 |
select 1 from dual where nvl(null,-1)<>nvl(null,-1) | 什么都没有 |
select 1 from dual where 1=nvl(null,-1) | 什么都没有 |
select 1 from dual where 1<>nvl(null,-1) | 1 |