我有一个带有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-'开头(我可以手工处理少数例外情况)。
答案 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;