比较where子句中的字符串

时间:2013-02-14 10:22:02

标签: sql oracle11g

你好我根据sql中的字符串比较感到困惑。

select * from table where column1 = 'abc';

据我所知,字符串'abc'被转换为数字,让我们假装(1 + 2 + 3 = 6)这个例子。

这意味着

select * from table where column1 = 'cba'; 

也将具有相同的值6.字符串不一样。请赐教。

编辑:因为你认为这是一个笑话。

“将字符字母King转换为数字表示。假设US7ASCII数据库字符集具有AMERICAN NLS设置,则将文字王转换为其序数字符值的总和:K + i + n + g =(75 + 105 + 110 + 103 = 393)“。

这是一本令我困惑的书中的确切文字。

2 个答案:

答案 0 :(得分:3)

你宁愿这样看

    a= 00000100
    b= 00010000
    c= 01100100

    abc= 000001000001000001100100
    cba= 011001000001000000000100

因此不一样

答案 1 :(得分:1)

引用似乎来自chapter 9 of this OCA/OCP Oracle Database 11g All-in-One Exam Guide的第31页。这似乎是不正确的(善意),因为如果它起作用那么abccba确实会被视为等效。

11gR2 SQL language reference说:

  

在二进制比较中,默认情况下,Oracle比较字符   字符串根据数字代码的连接值   数据库字符集中的字符。一个角色更大   如果它具有比另一个更大的数值,则比另一个   字符集。

关键区别是短语'连接值',即更接近@JoroenMoonen演示的内容,其中字符集中的数字代码拼凑在一起;而不是书中显示的价值总和。

但是,考虑连接的每个字符的数字代码以及表示要比较的数字的结果(可能非常长!)字符串会产生误导。取这些值后,abc = 000001000001000001100100 = 266340cba = 011001000001000000000100 = 6557700。只需将6557700与266340进行比较,确实会显示cba大于'abc。但cb也“大于”abc - select greatest('abc', 'cb') from dual - 如果您进行相同的转换,则会得到cb = 0110010000010000 = 25616 ,这个数字显然小于266340。

我认为在equivalent 10gR1 documentation

中实际上有更好的解释
  

Oracle将两个字符逐个字符地比较   不同的人物。具有更大字符的值   位置被认为更大。如果两个不同长度的值是   相同到较短的一端,则值越长   考虑更大。如果两个相等长度的值没有差别   字符,则认为这些值相等。

因此,假设ASCII,c(99)大于a(97),因此不需要查看任何字符串中的任何其他字符。这永远不会将abccba视为等效。

无论如何,你对这本书的解释感到困惑是完全正确的。