了解ORACLE在关键字之间的关系

时间:2017-05-03 23:06:06

标签: sql oracle

我正在帮助一个同事调试一个返回奇怪结果的查询。我们把它缩小到一条看起来像这样的线:

'11201'和'111226'之间的COL在哪里

COL中的值来自对substring的调用,因此它是一个字符串类型值。这不会返回任何结果。

天真地,我一直认为BETWEEN表示> =和< =并且如果用字符串调用它,它会将所有内容都转换为数值类型值。如果你有类似的东西,那就行得很好。

'11201'和'11226'之间的COL在哪里

在我们使用它的情况下返回结果。

显然,由于第二个片段会返回结果,但第一个片段没有,我的理解是错误的。

我将所有内容都转换为数字并再次尝试,并获得了预期的行为。从这一点来看,似乎我可以得出结论,当它进行字符串比较时,它实际上没有转换值 - 而是逐字逐句。当它到达第三个角色并且看到2>在下限参数中,它根据Oracle documents中的以下行为退出:

如果expr3< expr2,则间隔为空。

如果这真的发生在引擎盖下,那么任何人都可以权衡吗?

谢谢!

2 个答案:

答案 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