21

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

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

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

SELECT MAX( invoice_number )
FROM `invoice_header`
4

6 回答 6

27

HKL9(string) 大于HKL15,因为它们作为字符串进行比较。处理您的问题的一种方法是定义一个仅返回发票编号的数字部分的列函数。

如果您的所有发票编号都以 开头HKL,那么您可以使用:

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

它采用不包括前 3 个字符的 invoice_number,转换为 int,并从中选择 max。

于 2013-05-11T12:14:50.417 回答
7
select ifnull(max(CONVERT(invoice_number, SIGNED INTEGER)), 0)
from invoice_header 
where invoice_number REGEXP '^[0-9]+$'
于 2016-05-26T10:35:59.980 回答
5

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

select MAX(CAST(REPLACE(REPLACE(invoice_number , 'HKL', ''), '', '') as int)) from invoice_header
于 2017-01-18T20:54:29.370 回答
2

这也应该有效

SELECT invoice_number
FROM invoice_header
ORDER BY LENGTH( invoice_number) DESC,invoice_number DESC 
LIMIT 0,1
于 2016-12-07T07:48:31.087 回答
1

您的问题更多的是定义和设计。

选择具有最高 ID 或 DATE 的发票编号,或者——如果这些确实与“最高发票编号”不相关——定义一个额外的列,它与发票编号相关,并且足够简单,让糟糕的数据库能够理解.

select INVOICE_NUMBER 
from INVOICE_HEADER
order by ID desc limit 1;

这并不是说数据库不够智能.. 而是你问错了问题。

于 2013-05-11T12:16:41.277 回答
1

可以使用以下查询:

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

于 2020-01-25T10:08:50.600 回答