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会:
Z(即:'Z'||CHR(0)||'OCO')Z实际上被视为不同的字母,其排序顺序超出给定范围.我不知道这样的语言环境是否存在,但是例如,在Welch中,LL被认为是应该在普通之后排序的单个字母L.见http://en.wikipedia.org/wiki/Alphabetical_order#Language-specific_conventions0, or ?代替O你的数据.| 归档时间: |
|
| 查看次数: |
2824 次 |
| 最近记录: |