how to select max of mixed string/int column?

2019-01-18 12:01发布

Lets say that I have a table which contains a column for invoice number, the data type is VARCHAR with mixed string/int values like:

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

I tried to select max of it, but it returns with "HKL9", not the highest value "HKL15".

SELECT MAX( invoice_number )
FROM `invoice_header`

5条回答
Lonely孤独者°
2楼-- · 2019-01-18 12:16

HKL9 (string) is greater than HKL15, because they are compared as strings. One way to deal with your problem is to define a column function that returns only the numeric part of the invoice number.

If all your invoice numbers start with HKL, then you can use:

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

It takes the invoice_number excluding the 3 first characters, converts to int, and selects max from it.

查看更多
倾城 Initia
3楼-- · 2019-01-18 12:33

This should work also

SELECT invoice_number
FROM invoice_header
ORDER BY LENGTH( invoice_number) DESC,invoice_number DESC 
LIMIT 0,1
查看更多
你好瞎i
4楼-- · 2019-01-18 12:37

After a while of searching I found the easiest solution to this.

select MAX(CAST(REPLACE(REPLACE(invoice_number , 'HKL', ''), '', '') as int)) from invoice_header
查看更多
我想做一个坏孩纸
5楼-- · 2019-01-18 12:38

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

查看更多
时光不老,我们不散
6楼-- · 2019-01-18 12:39

Your problem is more one of definition & design.

Select the invoice number with highest ID or DATE, or -- if those really don't correlate with "highest invoice number" -- define an additional column, which does correlate with invoice-number and is simple enough for the poor database to understand.

select INVOICE_NUMBER 
from INVOICE_HEADER
order by ID desc limit 1;

It's not that the database isn't smart enough.. it's that you're asking it the wrong question.

查看更多
登录 后发表回答