我正在帮助一个同事调试一个返回奇怪结果的查询。我们把它缩小到一条看起来像这样的线:
'11201'和'111226'之间的COL在哪里
COL中的值来自对substring的调用,因此它是一个字符串类型值。这不会返回任何结果。
天真地,我一直认为BETWEEN表示> =和< =并且如果用字符串调用它,它会将所有内容都转换为数值类型值。如果你有类似的东西,那就行得很好。
'11201'和'11226'之间的COL在哪里
在我们使用它的情况下返回结果。
显然,由于第二个片段会返回结果,但第一个片段没有,我的理解是错误的。
我将所有内容都转换为数字并再次尝试,并获得了预期的行为。从这一点来看,似乎我可以得出结论,当它进行字符串比较时,它实际上没有转换值 - 而是逐字逐句。当它到达第三个角色并且看到2>在下限参数中,它根据Oracle documents中的以下行为退出:
如果expr3< expr2,则间隔为空。
如果这真的发生在引擎盖下,那么任何人都可以权衡吗?
谢谢!
答案 0 :(得分:4)
表达式:
WHERE COL BETWEEN '11201' AND '111226'
与:
相同WHERE COL >= '11201' AND COL <= '111226'
这不会返回任何原因,因为 - 作为字符串 - &#39; 11201&#39; &GT; &#39; 111226&#39 ;.这使用了字母顺序,所以如果你使用字母会更清楚:
WHERE COL BETWEEN 'BBCAB' AND 'BBBCCG'
显然,这些值之间没有任何字母,因为'BBC'
在 'BBB'
之后出现。
道德?如果您想要直观的比较,请使用正确的类型。
答案 1 :(得分:2)
在下面的表达中
WHERE COL BETWEEN '11201' AND '111226'
您正在将文本列COL
与文本进行比较。字符串'11201'
按字典顺序大于字符串'111226'
。换句话说,'11201'
在 '111226'
之后来自,或者前者更多而不是后者。这就是为什么没有结果回来的原因。但是,如果您将COL
转换为数字,并将其与数字进行比较,那么比较可能有效,假设有匹配的记录:
WHERE TO_NUMBER(COL) BETWEEN 11201 AND 111226