mysql 如何选择混合字符串/整数列最大值?

dffbzjpn  于 2023-01-29  发布在  Mysql
关注(0)|答案(7)|浏览(152)

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

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

我试着选择它的最大值,但它返回“HKL 9”,而不是最高值“HKL 15”。

SELECT MAX( invoice_number )
FROM `invoice_header`
vlju58qv

vlju58qv1#

HKL9(string)大于HKL15,因为它们是作为字符串进行比较的。处理此问题的一种方法是定义一个列函数,该函数仅返回发票编号的数字部分。
如果所有发票编号都以HKL开头,则可以用途:

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

它取invoice_number(不包括前3个字符),转换为int,然后从中选择max。

wswtfjt7

wswtfjt72#

select ifnull(max(CONVERT(invoice_number, SIGNED INTEGER)), 0)
from invoice_header 
where invoice_number REGEXP '^[0-9]+$'
nbewdwxp

nbewdwxp3#

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

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

qyyhg6bp4#

这也应该起作用

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

hgqdbh6s5#

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

**选择ID或DATE最高的发票号,**或者--如果它们 * 真的 * 与“最高发票号”不相关--定义一个附加列,该列与发票号相关,并且对于较差的数据库来说足够简单以便于理解。

select INVOICE_NUMBER 
from INVOICE_HEADER
order by ID desc limit 1;

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

i1icjdpr

i1icjdpr6#

可使用以下查询:
select max(cast((CASE WHEN max_no NOT LIKE '%[^0-9]%' THEN max_no END) as int)) AS max_int_no from table1

polhcujo

polhcujo7#

对于mysql数据库我使用如下:

SELECT CONCAT('HK','L',MAX(ABS(SUBSTRING_INDEX(invoice_number,'L', -1))))AS maxInvoice FROM invoice_header

因为所有的发票号都可以用字母“L”作为分隔符,所以使用-〉SUBSTRING_INDEX()函数来拆分发票号,然后使用concat()函数将它们再次连接起来以获得最大发票号。

相关问题