SQL NULL值比较陷阱

数据库里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
    原文作者:chanjarster
    原文地址: https://segmentfault.com/a/1190000006189065
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞