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

Mysql 如何选择混合字符串/int列的最大值?,mysql,select,max,mixed,Mysql,Select,Max,Mixed,假设我有一个表,其中包含一列发票编号,数据类型为VARCHAR,混合了字符串/int值,如: invoice_number ************** HKL1 HKL2 HKL3 ..... HKL12 HKL13 HKL14 HKL15 我试图选择它的最大值,但它返回的是HKL9,而不是最高值HKL15 SELECT MAX( invoice_number ) FROM `invoice_header` HKL9字符串大于

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

invoice_number
**************
    HKL1
    HKL2
    HKL3
    .....
    HKL12
    HKL13
    HKL14
    HKL15
我试图选择它的最大值,但它返回的是HKL9,而不是最高值HKL15

SELECT MAX( invoice_number )
FROM `invoice_header`
HKL9字符串大于HKL15,因为它们作为字符串进行比较。解决问题的一种方法是定义一个列函数,该函数只返回发票号的数字部分

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

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

它接受发票编号(不包括前3个字符),转换为int,并从中选择max。

您的问题不仅仅是定义和设计

选择具有最高ID或日期的发票号,或者-如果这些确实与最高发票号不相关-定义一个额外的列,该列与发票号相关,并且足够简单,让较差的数据库能够理解

select INVOICE_NUMBER 
from INVOICE_HEADER
order by ID desc limit 1;
这并不是因为数据库不够智能。。这是因为你问错了问题。

这也应该有效

select ifnull(max(CONVERT(invoice_number, SIGNED INTEGER)), 0)
from invoice_header 
where invoice_number REGEXP '^[0-9]+$'
SELECT invoice_number
FROM invoice_header
ORDER BY LENGTH( invoice_number) DESC,invoice_number DESC 
LIMIT 0,1

经过一段时间的搜索,我找到了最简单的解决办法

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

可以使用以下查询:


选择maxcastCASE当max_no不喜欢“[^0-9]”然后从表1中选择max_no END as int as max_int no

谢谢@Thomas W,但是如果我问错了,我该怎么问呢?我想这也是按描述订购的。编号最高的发票应该是最近的;按ID,或按日期。您不应该期望数据库解码任意字符串,但它们在主键索引扫描方面非常快:谢谢@nakosspy,但我如何使用php/mysql做到这一点呢?该语句是标准SQL。您可以像任何其他语句一样执行它。我知道了,它是:从表中选择maxsubstringinvoice\u编号,4,LengthinInvoice\u编号-3选择MAXCASTSUBSTRINGinvoice\u编号,4,LengthinInvoice_编号-3未从表中签名这是这里唯一正确的答案,因为即使发票编号具有不同的格式,它也可以工作,并且不修改数据库。这不会提取发票编号的数字部分,以防在回答旧问题时有前导字母,如果您包含一些上下文来解释您的答案是如何帮助的,那么您的答案对其他StackOverflow用户会更有用。请参阅:。