SELECT * FROM locations ORDER BY cast(X as decimal), X, Y
此代码的打印方式如下:
ADMIN
CAFE
CDC
CMAT
1
1.5
2
10
10.5
18
我正在寻找一种方法将alpha放在底部,数字放在顶部,顺序如图所示。
1
1.5
2
10
10.5
18
ADMIN
CAFE
CDC
CMAT
答案 0 :(得分:1)
几乎就是
$sql = "(SELECT *,cast(X as decimal) FROM locations WHERE X REGEXP '^[0-9]') UNION ALL
(SELECT *,X FROM locations WHERE X REGEXP '^[a-z,A-Z]')
ORDER BY X";
顶部的数字,但1,1.5,10,10.5,18,2
instead of 1, 1.5, 2, 10, 10.5, 18
底部的Alpha是按顺序ADMIN,CAFE,CDC,CMAT
答案 1 :(得分:0)
你可以使用2个查询与regexp一个查询的联合来匹配数字并以升序方式对它们进行排序,在第二个查询中只获取非数字的数据
(SELECT * FROM locations
where x REGEXP '^[0-9]'
order by cast(x as decimal)
)
union
(SELECT * FROM locations
where x REGEXP '^[0-9]' = 0
order by x
)
Demo
另一个解决方案是首先通过强制转换然后使用子选择并通过regexp命令
select * from (
select * from locations
order by cast(x as decimal) , x
) t
order by x REGEXP '^[0-9]' desc
Demo 2
答案 2 :(得分:-1)
$sql = "(SELECT * FROM locations WHERE X REGEXP '^[1-9][0-9]'
ORDER BY cast(X as decimal), X, Y)
UNION ALL
(SELECT * FROM locations WHERE X REGEXP '^[a-z,A-Z]') ORDER BY X, Y";
将[1-9]添加到REGEXP使其正常工作。