【问题标题】:Inequality comparison between strings in OracleOracle中字符串之间的不等式比较
【发布时间】:2015-12-17 23:39:50
【问题描述】:
SELECT LAST_NAME FROM Employees
WHERE last_name < 'King';

在“SQL Fundamentals I Exam Guide”一书中,它说在比较 LAST_NAME &lt; 'King' 时在 NLS 设置中发生以下转换,假设使用美国 NLS 设置的 US7ASCII 数据库字符集:

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

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

【问题讨论】:

    标签: oracle comparison inequality


    【解决方案1】:

    这条规则肯定是无效的。如果是,那么您可以交换字符,您仍然会得到相同的结果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
    

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

    也就是说,2个单词的字符逐个字符进行比较,直到遇到两个不同的字符。然后将这两个字符进行比较得出最终结果。

    'Kelvin' &lt; 'King'为例:

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

    其他例子'King' &lt; 'Kelvin'(换词):

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

    其他例子'be' &lt; 'begin':

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

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

    【讨论】:

      【解决方案2】:

      如果这确实是这本书所说的,那本书是非常不正确的,而且非常可怕。如果我们谈论的是 Oracle Press 的书,我强烈怀疑你误解了解释,因为我很难想象这个错误是如何在不被作者、编辑或审稿人发现的情况下完成的.

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

      【讨论】:

      • 我理解你的解释,但我仍然认为这本书遵循另一个规则来解决这个不平等,如果你想在这里阅读这本书就是这样i.imgur.com/KqfCczS.png?1
      • @RoniCastro - 这本书所建议的方法从根本上说,完全,完全,绝对不正确。
      • 我什至无法想象他们是如何设法真正写出这本书并通过一本为您准备考试的书中的所有 QC 的。也许他们从here 误解了In binary comparison, which is the default, Oracle compares character strings according to the concatenated value of the numeric codes of the characters in the database character set.?这仍然是一个严重的误解,它说明了本书作者的实际经历。
      猜你喜欢
      • 2023-03-08
      • 2010-09-28
      • 1970-01-01
      • 2015-11-19
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多