假设我有一个包含发票编号列的表,数据类型为VARCHAR,其中包含混合字符串/ int值:
invoice_number
**************
HKL1
HKL2
HKL3
.....
HKL12
HKL13
HKL14
HKL15
我试图选择最大值,但它返回“HKL9”,而不是最高值“HKL15”。
SELECT MAX( invoice_number )
FROM `invoice_header`
答案 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