`

二元值not in与in使用分析

    博客分类:
  • SQL
 
阅读更多
语句
select 'true' from dual where (1,2)  not in ((1,3),(3,null))
结果:true.
1找一个非null元素(范围比较目标项)开始首轮匹配,先匹配第一个元素
2比较元item的第1个元素为1,比较目标item的第1个元素分别为1,3,匹配比较目标item(1,3)成功,故首轮匹配有相等项
3首轮匹配有相等项,进行第2轮比较,限定第2轮比较范围为首轮匹配成功项的元素,结论(1,3),二轮匹配没有有相等项
4 查询结束,没有匹配到相等项,返回true


语句
select 'true' from dual where (2,1) not in ((3,3),(1,null))
结果:true.
1找一个非null元素开始首轮匹配,先匹配第一个元素
2比较元item的第一个元素2,比较目标item的第一个元素分别为 3,1,匹配没有相等项,故首轮匹配没有相等的元素
3首轮匹配没有相等项,短路第2轮比较,直接返回首轮匹配结果true

语句
select 'true' from dual where (2,3) not in ((1,3),(null,1))
结果:true.
1找一个非null元素开始首轮匹配,先匹配第2个
2比较元item的第2个元素为3,比较目标item的第2个元素分别为3,1,匹配比较目标item(1,3)相等,故首轮匹配有相等元素
3首轮匹配有相等项,进行第2轮比较,限定第2轮比较范围为首轮匹配成功项的元素,范围为(1,3)项,
4二轮比较元item的第1个元素2,比较范围目标item的第一个元素为1,匹配没有相等的元素
5查询结束,都没有匹配到相等项,返回true

select 'true' from dual where (2,3) not in ((1,3),(2,null))
结果:为空
1找一个非null元素开始首轮匹配,先匹配第1个
2比较元item的第1个元素为2,比较目标item的第2个元素分别为1,2,匹配比较目标item(2,null)相等,故首轮匹配有相等的元素
3首轮匹配有相等项,进行第2轮比较,限定第2轮比较范围为首轮匹配成功项的元素,范围为(2,null),
4二轮比较元item的第二个元素3比较范围目标item的第二个元素为null,如果与null比较,一律按照返回false来处理
5查询结束,返回false



in/not in在判断NULL时用的与=/<>一样的方式,即必须用is   null来判断,否则始终为失败。

总结:二元值not in的情况,比较步骤如下

术语定义
项:(1,3),(null,1)叫做项(item);
元素:1和3称为元素,归属于项(item)

1:找一个非null元素开始首轮匹配
2:首轮匹配没有相等元素,短路第二轮匹配,直接返回结果
3:首轮匹配有相等的元素,进行第二轮匹配,比较范围是首轮匹配相等项的元素,如果与null比较,一律按照返回false来处理,返回二轮结果作为总结果


in的情况,比较步骤如下
与null比较的时候,一律按照匹配不相等来处理,可以忽略掉不比较



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics