2012-04-02 60 views
3

我发现了一个关于SQL中MAX()函数的非常有趣/奇怪的事情。
我有VARCHAR2(20)的数据类型列ID,具有以下输入: -
ID
1
2
3
4
5
6
9
99
909
按我理解如果我使用 “选择最大值(ID)从表;”我应该得到909的结果,但我得到99.有人可以解释为什么会发生这种情况吗?SQL MAX()函数

回答

5

由于您正在使用MAX的列的类型为VARCHAR,因此它将基于逐个字符的评估对值进行排序。它选择99,因为9> 0,它会忽略字符串的其余部分。

9

您误会了 - 因为列是varchar,而不是数字,所以按字符串值排序; 909之前99,所以99是最大的。

要查看列的最大数值,尝试:

select max(to_number(ID)) from my_table 
+0

你能建议SQL来执行转换并产生答案吗?假设我们不能总是只在需要时更改数据库模式。 – DOK 2012-04-02 17:57:42

+0

@DOK:如上? – 2012-04-02 17:58:28

+0

我可以理解这些机制......有些参考文献可以帮助我。 – 2012-04-02 17:59:14

3

你列被表示为字符,而不是数字。所以把它看作按字母顺序排列。按字母顺序909将按照升序排列在99之前。