您好我想对表格进行排序。该字段包含数字,字母和带字母的数字,即
1 2 1a 11a a 6a b
我想对此进行排序,
1 1a 2 6a 11a a b
我的代码是,
SELECT * FROM t
ORDER BY CAST(st AS SIGNED), st
但结果是,
a b 1 1a 2 6a 11a
我在此网址中找到了此代码
"http://www.mpopp.net/2006/06/sorting-of-numeric-values-mixed-with-alphanumeric-values/"有人请帮助我
答案 0 :(得分:5)
这将执行您所需的排序顺序,即使表中存在0
;
SELECT * FROM t
ORDER BY
st REGEXP '^[[:alpha:]].*',
st+0,
st
st+0
将0添加到字符串开头的数字部分并返回一个int)答案 1 :(得分:2)
您可以使用:
SELECT *
FROM t
ORDER BY
st+0=0, st+0, st
使用st+0
varchar列将被转换为int。按st+0=0
排序会在底部放置字母数字行(如果字符串以字母数字字符开头,则st + 0 = 0将为1,oterwise将为0)
请参阅小提琴here。
答案 2 :(得分:0)
您获得此输出的原因是所有字符如'a','b'等都会转换为'0',如果您使用ASC的订单,它将显示在顶部。
SELECT CAST(number AS SIGNED) from tbl
正在返回
1
2
1
11
0
6
0
看看这个小提琴: - SQL FIDDLE
答案 3 :(得分:-3)
我在您的查询中做了一些小改动 -
SELECT *, CAST(st AS SIGNED) as casted_column
FROM t
ORDER BY casted_column ASC, st ASC
这应该有效。 理论上你的语法应该有效,但不确定为什么mysql在tag之后不接受这些方法。 如此创建临时字段,然后对该字段进行排序。
这应该按照我的经验运作,你可以检查一下。