关于一个"恒真(恒假)条件"与"NULL参与比较判断"共同作用引发的语句结果异常

看标题,自己也觉得有些拗口.
主要是两方面:
(1)恒真(恒假)条件:
不少开发人员,为了拼接语句的便利,采用恒真(比如1=1)条件为基础,拼接若干个and条件,这样就可以不做判断条件之前应该是where还是and,同样道理,采用恒假(比如1<>1)条件为稽查,拼接若干个or条件,这样就可以不做判断条件前面应该是where还是or.
这种做法,在逻辑上是正确的.但有时候也会有问题.

(2)NULL参与比较判断
大家知道,如果需要判断是否为NULL,不能用=和<>,而是需要用is NULL或者is not NULL,或者用IsNULL函数将NULL转换为一个非NULL的值之后再进行比较.如果用=或者<>,出现的情况极有可能与预想的不同.

下面这个例子(伪SQL语句,可惜精确的语句当时并未保存),是两个因素一起出现在一个语句中的异常现象.
select ...
from A,B,C
where A.f1=*B.f1
and ...
and ( (substr(A.f2,1,4)='abcd' and {此处省略几个结果为true的关联条件})
     or 1<>1
    )
场景是substr(A.f2,1,4)实际值是NULL.
如果去掉or 1<>1,则能查询出结果,如果加上or 1<>1,就不能查询出结果了.

对这个奇怪的现象,通过查看执行计划简单分析了一下,去掉or 1<>1的情况下,经过了三次嵌套循环连接之后出现一次filter,而加上or 1<>1,经过了两次嵌套循环连接,就出现filter,而另一次嵌套循环,是发生在filter之后.
总之,恒真(恒假)条件的有无,使执行计划有所不同,而执行计划的不同,又影响了语句的结果.

启示:谨慎使用1=1或1<>1这种恒真恒假条件,谨慎对待NULL参与比较判断.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29512902/viewspace-1254885/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29512902/viewspace-1254885/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值