如何选择混合字符串/ int列的最大值?

时间:2013-05-11 12:03:17

标签: mysql select max mixed

假设我有一个包含发票编号列的表,数据类型为VARCHAR,其中包含混合字符串/ int值:

invoice_number
**************
    HKL1
    HKL2
    HKL3
    .....
    HKL12
    HKL13
    HKL14
    HKL15

我试图选择最大值,但它返回“HKL9”,而不是最高值“HKL15”。

SELECT MAX( invoice_number )
FROM `invoice_header`

6 个答案:

答案 0 :(得分:22)

HKL9(字符串)大于HKL15,因为它们被比较为字符串。解决问题的一种方法是定义一个只返回发票号的数字部分的列函数。

如果您的所有发票编号均以HKL开头,则可以使用:

SELECT MAX(CAST(SUBSTRING(invoice_number, 4, length(invoice_number)-3) AS UNSIGNED)) FROM table

将invoice_number排除在3个第一个字符之外,转换为int,并从中选择max。

答案 1 :(得分:5)

从invoice_header中选择ifnull(最大值(CONVERT(invoice_number,SIGNED INTEGER)),0)其中invoice_number REGEXP' ^ [0-9] + $'

答案 2 :(得分:2)

你的问题更像是一个定义&设计。

选择ID值最高或日期为的发票号码,或者 - 如果真的 与“最高发票号码”无关 - 请定义其他列,它与发票号码相关,并且很容易让穷人数据库理解。

select INVOICE_NUMBER 
from INVOICE_HEADER
order by ID desc limit 1;

这并不是说数据库不够聪明......而是你提出错误的问题。

答案 3 :(得分:2)

这也应该起作用

SELECT invoice_number
FROM invoice_header
ORDER BY LENGTH( invoice_number) DESC,invoice_number DESC 
LIMIT 0,1

答案 4 :(得分:1)

经过一段时间的搜索,我找到了最简单的解决方案。

select MAX(CAST(REPLACE(REPLACE(invoice_number , 'HKL', ''), '', '') as int)) from invoice_header

答案 5 :(得分:0)

可以使用以下查询:

select max(cast((CASE WHEN max_no NOT LIKE '%[^0-9]%' THEN max_no END) as int)) AS max_int_no from table1