用于按数字部分排序字母数字字符串的SQL

时间:2017-01-07 14:42:38

标签: mysql sorting

我有一个带有VARCHAR列的MySQL表,其中包含如下值:

abc-1
abc-2
abc-10
...etc.

有没有办法按顺序中的数字部分在MySQL中对它进行排序:

abc-1
abc-2 

而不是

abc-1
abc-10
abc-2

澄清数据值

典型值为mir-1,mir-14,mir-193,最高值为mir-4987。为简化起见,我们假设所有内容都以'mir-'开头(我可以手工处理少数例外情况)。

2 个答案:

答案 0 :(得分:2)

假设您的列可以包含abc-1或其他值,例如defg-12 并且您希望首先订购abc个,之后订购其他的。

SELECT 
    *
FROM
    your_table
ORDER BY SUBSTRING_INDEX(t, '-', 1) , CAST(SUBSTRING_INDEX(t, '-', - 1) AS UNSIGNED);

答案 1 :(得分:1)

您还可以添加1或2个自动计算字符串和整数的虚拟列,并将其直接命令到int。那么你也可以在这个列上使用索引。

添加虚拟列使用如下查询:

package main

import "os/exec"

func main() {
    cmd := exec.Command("./ext-tool.bin")
    err := cmd.Run()
    if err != nil {
        os.Exit(1)
    }
}

<强>样品

ALTER TABLE your_table 
ADD s1 VARCHAR(32) GENERATED ALWAYS AS (SUBSTRING_INDEX(t, '-',  1)) STORED,
ADD i1 INT(11)     GENERATED ALWAYS AS (SUBSTRING_INDEX(t, '-', -1)) STORED;