假设我有一个表,其中包含发票号列,数据类型为VARCHAR,包含混合的字符串/整数值,例如:
invoice_number
**************
HKL1
HKL2
HKL3
.....
HKL12
HKL13
HKL14
HKL15
我试图选择其中的最大值,但它返回的是“HKL9”,而不是最高值“HKL15”。
SELECT MAX( invoice_number )
FROM `invoice_header`
HKL9
(字符串)大于HKL15
,因为它们是作为字符串进行比较的。解决问题的一种方法是定义一个列函数,仅返回发票号码的数字部分。
如果您所有的发票号码都以HKL
开头,则可以使用以下方法:
HKL
开头,则可以使用:SELECT MAX(CAST(SUBSTRING(invoice_number, 4, length(invoice_number)-3) AS UNSIGNED)) FROM table
使用发票号码,排除前三个字符,将其转换为整数,并从中选择最大值。
select ifnull(max(CONVERT(invoice_number, SIGNED INTEGER)), 0)
from invoice_header
where invoice_number REGEXP '^[0-9]+$'
经过一段时间的搜索,我找到了最简单的解决方案。
select MAX(CAST(REPLACE(REPLACE(invoice_number , 'HKL', ''), '', '') as int)) from invoice_header
SELECT invoice_number
FROM invoice_header
ORDER BY LENGTH( invoice_number) DESC,invoice_number DESC
LIMIT 0,1
select INVOICE_NUMBER
from INVOICE_HEADER
order by ID desc limit 1;
并不是数据库不够聪明,而是你提出了错误的问题。
对于 MySQL 数据库,我使用以下代码:
SELECT CONCAT('HK','L',MAX(ABS(SUBSTRING_INDEX(invoice_number,'L', -1))))AS maxInvoice FROM invoice_header
因为所有的发票号码都可以使用字母“L”作为分隔符,所以可以使用SUBSTRING_INDEX()函数来拆分发票号码,然后使用concat()函数将它们再次连接起来以获取最大的发票号码。
table
- CairoCoder