MAX(列)返回错误的值

时间:2014-08-18 09:42:53

标签: mysql sql

我想从我的发票表中检索最大发票编号,当我选择所有可以清楚地看到最大发票编号为“10”的记录时,它会返回以下内容。

select * from invoice

enter image description here

但是当我查询

select MAX(invoice_number) as maxinv from invoice

它返回“9”。那是为什么?

enter image description here

3 个答案:

答案 0 :(得分:5)

如果您的invoice_number存储为文本列,则会出现这种情况,例如varchar(10)。在这种情况下,根据字母顺序,9将是最大值。

理想情况下,您应该将要执行数值运算的值存储为数值数据类型,例如int。但是,如果由于某种原因您无法更改列数据类型,则可以在应用MAX之前尝试强制转换列,如下所示:

select max (convert(invoice_number, signed integer)) as maxinv from invoice

注意:我特别提到了您要执行数字操作的"值" ,因为有些情况下输入文本是完全数字的,例如电话号码或信用卡卡号,但不存在您想要添加2个电话号码或采用信用卡号码的平方根的情况。这些值应存储为文本。

答案 1 :(得分:3)

这是因为您的专栏是VARCHAR,请尝试将其投放到UNSIGNED

select MAX(CAST(invoice_number AS UNSIGNED)) as maxinv from invoice

正如Joshi注意到的,如果你有负值,你可以使用SIGNED

select MAX(CAST(invoice_number AS SIGNED)) as maxinv from invoice

答案 2 :(得分:1)

这是一个伪代码,试着看看它。

SELECT MAX(CAST(invoice_number AS SIGNED)) from invoice