oracle子查询中not in后面不能为null值的理解

首先说说oracle中的null值吧。

null在oracle中代表未知,表示可能有,也可能没有。任何与null值的普通运算都为null,但可以用一些函数来处理null值,oracle排序中默认null最大。


接着进入正文


这里in后面有null,能返回数据


但加了not后,就不能返回数据了

这里的in后面的句子可以理解为or拼接,即

id in (200,201,null)可以等价于id=200 or id=201or id=null,

id not in (200,201,null)可以等价于not(id=200 or id=201or id=null)或id!=200 and id!=201 and id=null。

为什么都是or拼接,in可以而not in不可以呢,可以把not in理解为后面的and表达式就知道了,因为id=null为null,也就相当于false,导致整个表达式为false,无论传何值都为false,自然无法返回数据。

当然若硬要用or表达式来解释呢,其实可以看not 后面的这个括号,有括号意味着要确定里面的返回值再加not。

例如id为201,整个in 的or表达式为

false or true or null,当执行到true时就可返回,无需看null值了。

而在 not in的or表达式中是

not (fasle or true or null),我的理解是由于括号的存在,需要把表达式全运行一遍,不能向无括号那样运行到true就可返回,所以括号内运行一遍表达式由于有null参与运算,运算之后都为null,相当于false,所以就无法选定行了


当发现not in后的子查询后面有null值是,可以在子查询里用is not null或函数过滤null值。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值