【问题标题】:how to select max of mixed string/int column?如何选择混合字符串/整数列的最大值?
【发布时间】:2013-05-06 00:01:05
【问题描述】:

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

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

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

SELECT MAX( invoice_number )
FROM `invoice_header`

【问题讨论】:

    标签: mysql select max mixed


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢@nakosspy,但我如何使用 php/mysql 做到这一点?
    • 该语句是标准 SQL。您可以像执行任何其他语句一样执行它。
    • 我明白了,它是:SELECT max(substring(invoice_number, 4, length(invoice_number)-3)) FROM table
    • SELECT MAX(CAST(SUBSTRING(invoice_number, 4, length(invoice_number)-3) AS UNSIGNED)) FROM table
    【解决方案2】:

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

    选择 ID 或 DATE 最高的发票编号, 或 -- 如果这些确实与“最高发票编号”不相关 -- 定义一个附加列,这确实与发票编号相关,并且对于可怜的数据库来说足够简单。

    select INVOICE_NUMBER 
    from INVOICE_HEADER
    order by ID desc limit 1;
    

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

    【讨论】:

    • 谢谢@Thomas W,但是如果我问错了,我应该怎么问呢?
    • 我认为也是按 desc 排序的。
    • 编号最高的发票应该是最近的;按 ID 或按日期。您不应该期望数据库解码任意字符串,但它们在进行主键索引扫描方面真的很快:)
    【解决方案3】:
    select ifnull(max(CONVERT(invoice_number, SIGNED INTEGER)), 0)
    from invoice_header 
    where invoice_number REGEXP '^[0-9]+$'
    

    【讨论】:

    • 这是这里唯一正确的答案,因为即使发票编号有不同的格式,它也可以工作,并且无需修改数据库即可工作。
    • 如果有前导字母,这不会提取 invoice_number 的数字部分
    【解决方案4】:

    这应该也可以

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        可以使用以下查询:

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

        【讨论】:

        • 在回答一个老问题时,如果您包含一些上下文来解释您的答案如何提供帮助,那么您的答案将对其他 StackOverflow 用户更有用。请参阅:How do I write a good answer
        猜你喜欢
        • 2015-07-26
        • 2022-01-20
        • 2018-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-03
        • 1970-01-01
        相关资源
        最近更新 更多