用于字符串比较的Oracle NOT BETWEEN与<=和> =的结果不同

use*_*146 9 oracle comparison-operators

使用Oracle 11gR2 Expression Edition.我的数据如下所示

ordertype
---------
ZOCO
ZOSA
ZOST
Run Code Online (Sandbox Code Playgroud)

我们试图找出列不在某个值范围之间的记录.

如果我使用<=和> =运算符运行查询: SELECT * FROM table where ordertype <= 'ZAAA' OR ordertype >= 'ZZZZ'; 那么我得到0结果.这是正确的答案.

但是,如果我使用NOT BETWEEN: SELECT * FROM table where ordertype NOT BETWEEN 'ZAAA' AND 'ZZZZ'; 那么它会给出多次点击.

我的理解是两种语法都应该给出相同的结果,但事实并非如此.我错过了什么?原因我想使用NOT BETWEEN,因为我们现有的很多代码已经有了这种语法,我不想在不理解原因的情况下改变它.

谢谢.


感谢所有发布的人.我再次运行查询,在第一个查询中修复"OR"后,结果是一样的.我仍然有一个问题,为什么Oracle字符排序没有按预期识别它,但我的问题是关于NOT BETWEEN和<>之间的区别是一个误报.我为混乱道歉.

Syl*_*oux 10

SELECT * FROM table where ordertype <= 'ZAAA' AND ordertype >= 'ZZZZ';
Run Code Online (Sandbox Code Playgroud)

没有字符串可以是<='ZAAA' > ='ZZZZ'.你需要使用析取:

SELECT * FROM table where ordertype < 'ZAAA' OR ordertype > 'ZZZZ';
Run Code Online (Sandbox Code Playgroud)

BTW,鉴于其BETWEEN具有包容性,NOT BETWEEN是独家的


这是一个常见的陷阱.你必须记住德摩根的法律:

not (A and B) 是相同的 (not A) or (not B)

您可以尝试使用这个简单的实例来说服自己,这些结果非常一致:http://sqlfiddle.com/#!4 / d41d8/38326


话虽这么说,只有这样,(我可以看到)对于像字符串ZOCO作为之间ZAAA,并ZZZZ会:

  • (一个遥远的facepalm声音)30年的编程exp,计算机科学学位,但我无法发现这一点.:-)我疲惫不堪的明显症状.+1为很好解释的答案. (4认同)