资讯专栏INFORMATION COLUMN

SQL NULL值比较陷阱

wudengzan / 2828人阅读

摘要:数据库里值的比较是一件非常坑爹事情,一不小心就会掉到陷阱里去。错了如果中有一个值为,那么结果就会变得很神奇。正确的做法如果你要对可能会对值做比较,安全且正确的做法是使用就如上面的结果什么都没有什么都没有

数据库里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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/35050.html

相关文章

  • SQL NULL比较陷阱

    摘要:数据库里值的比较是一件非常坑爹事情,一不小心就会掉到陷阱里去。错了如果中有一个值为,那么结果就会变得很神奇。正确的做法如果你要对可能会对值做比较,安全且正确的做法是使用就如上面的结果什么都没有什么都没有 数据库里null值的比较是一件非常坑爹事情,一不小心就会掉到陷阱里去。以一个非常常见的场景为例: SELECT * FROM some_table WHERE field1 = fie...

    ISherry 评论0 收藏0
  • SQL NULL比较陷阱

    摘要:数据库里值的比较是一件非常坑爹事情,一不小心就会掉到陷阱里去。错了如果中有一个值为,那么结果就会变得很神奇。正确的做法如果你要对可能会对值做比较,安全且正确的做法是使用就如上面的结果什么都没有什么都没有 数据库里null值的比较是一件非常坑爹事情,一不小心就会掉到陷阱里去。以一个非常常见的场景为例: SELECT * FROM some_table WHERE field1 = fie...

    waterc 评论0 收藏0
  • MySQL 中字符串字段,在使用in时,没有加引号时的性能陷阱

    摘要:在中看到不加引号时显示的用上了索引,变成了和全表扫描差不多了,只不过扫描时按索引的次序进行而不是行。提醒在多个中条件个数比较多或者多个条件时,实际性能都比较差的。以上测试我个人仅在中测试,高版本官方不知是否优化过。 场景和环境 redhat6.5 + 64位 + 12核心 + 16G 表数量 600w MySQL 5.0 问题描述 在使用in过程中,同事写了一个简单的in条件查询(...

    sewerganger 评论0 收藏0
  • 小心MySQL的隐式类型转换陷阱

    摘要:上面使用了,所以可以很明确的看到出现了隐式类型转换是,而后面的比较值是整型。解决该问题就是避免出现隐式类型转换带来的不可控把的内容写成字符串共返回行记录花费扫描行数从减少为。借这个机会,系统的来看一下中的隐式类型转换。 1. 隐式类型转换实例 今天生产库上突然出现MySQL线程数告警,IOPS很高,实例会话里面出现许多类似下面的sql:(修改了相关字段和值) SELECT f_col3...

    Ku_Andrew 评论0 收藏0
  • MySQL之ROUND函数四舍五入的陷阱

    摘要:在中,函数用于对查询结果进行四舍五入,不过最近使用函数四舍五入时意外发现并没有预期的那样,本文将这一问题记录下来,以免大家跟我一样犯同样的错误。从和执行函数的结果可以明确的看确实是转换为了最近的偶数。 在MySQL中,ROUND函数用于对查询结果进行四舍五入,不过最近使用ROUND函数四舍五入时意外发现并没有预期的那样,本文将这一问题记录下来,以免大家跟我一样犯同样的错误。 问题描述 ...

    loostudy 评论0 收藏0

发表评论

0条评论

wudengzan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<