Oracle中字符串之间的不等式比较

时间:2015-12-17 23:39:51

标签: oracle comparison inequality

SELECT LAST_NAME FROM Employees
WHERE last_name < 'King';

在书中的SQL基础I考试指南&#39;它表示在比较LAST_NAME < 'King'上,在NLS设置中发生以下转换,假设US7ASCII数据库字符集具有AMERICAN NLS设置:

K + i + n + g = 75 + 105 + 110 + 103 = 393.

然后,对于表EMPLOYEES表中的每一行,LAST_NAME列同样转换为数值。如果此值小于393,则选择该行。 但是当我执行上面的SELECT命令时,在SQL * PLUS上,它会返回不遵循本书中提到的规则的行(例如&#39; Greenberg&#39;,#39; Bernestein&#39;)。我是否需要进行任何设置才能获得满足该规则的行?

enter image description here

2 个答案:

答案 0 :(得分:4)

如果这实际上就是这本书的内容,那么这本书就非常可怕。如果我们谈论的是甲骨文出版社的书,我会强烈怀疑你误解了这个解释,因为我很难想象这个错误是如何在不被作者,编辑或审稿人抓住的情况下完成的。

要比较两个字符串,您执行的操作与您手动按字母顺序排列字符串时完全相同。字符串“B”位于字符串“All My Data”之后和字符串“Changes Constantly”之前。你取字符串的第一个字符并查看十进制表示('A'是65,'B'是66,'C'是67)并根据它进行排序。如果有联系,说“所有数据”和“所有索引”,你继续比较第二个字符并进行比较,直到你可以打破平局'D'是68,小于'I',这是73所以“所有数据“&lt; “所有索引”。

答案 1 :(得分:4)

此规则当然无效。如果是,那么你可以交换字符,你仍然会得到相同的结果393。但是在比较单词时字符排序很重要。

要获得适合比较的值,您必须计算如下:

K + i + n + g = ((75 × 256 + 105) × 256 + 110) × 256 + 103

但是你会超过长词的有效数值范围。对于7位ASCII代码(严格地在0 ... 127范围内),您也可以乘以128而不是256。

-

实际上,这些值是逐一比较的,即(伪代码):

valueOf(last_name[0]) < 75 OR
valueOf(last_name[1]) < 105 OR
valueOf(last_name[2]) < 110 OR
valueOf(last_name[3]) < 103

...比较在遇到的第一个不等式时停止,或者如果达到其中一个单词的结尾,则比较单词的长度。

换句话说,两个单词的字符逐个字符进行比较,直到遇到两个不同的字符。然后对这两个字符进行比较,得出最终结果。

'Kelvin' < 'King'为例:

'K' < 'K' ==> false
'e' < 'i' ==> true
final result = true

其他示例'King' < 'Kelvin'(单词被交换):

'K' < 'K' ==> false
'i' < 'e' ==> false, the characters are not equal, therefore stop
final result = false

其他示例'be' < 'begin'

'b' < 'b' ==> false
'e' < 'e' ==> false
end of first word reached, length('be') < length('begin') ==> true
final result = true

两个字符的实际比较是通过比较它们的数值来执行的,正如您已经提到的那样。