how to select max of mixed string/int column?

后端 未结 6 1230
没有蜡笔的小新
没有蜡笔的小新 2020-12-08 22:10

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
*********         


        
相关标签:
6条回答
  • 2020-12-08 22:35

    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.

    0 讨论(0)
  • 2020-12-08 22:35

    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.

    0 讨论(0)
  • 2020-12-08 22:37

    Below query can be used:

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

    0 讨论(0)
  • 2020-12-08 22:45

    This should work also

    SELECT invoice_number
    FROM invoice_header
    ORDER BY LENGTH( invoice_number) DESC,invoice_number DESC 
    LIMIT 0,1
    
    0 讨论(0)
  • 2020-12-08 22:48

    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
    
    0 讨论(0)
  • 2020-12-08 22:55
    select ifnull(max(CONVERT(invoice_number, SIGNED INTEGER)), 0)
    from invoice_header 
    where invoice_number REGEXP '^[0-9]+$'
    
    0 讨论(0)
提交回复
热议问题