我已经擦洗了SO并用Google搜索了几个小时。我找不到给出正确结果的自然排序 ORDER BY 子句。这是示例数据以及我想要的结果。另外,我不想创建单独的选择列进行排序。我需要 ORDER BY 子句来完成所有排序。感谢您提供的所有帮助。
Values Values (ASC) Values (DESC)
LS1 Jul-15 LS0 NS 8
8 LS0 NS 5
LS0 NS LS0 NS 4
4 LS0 NS 3
LS0 NS LS0 NS 1
LS0 NS LS0 NS -1
LS0 NS LS1 Jul-15 LS1 Jul-15
LS0 NS -1 LS0 NS
LS0 NS 1 LS0 NS
-1 3 LS0 NS
3 4 LS0 NS
1 5 LS0 NS
5 8 LS0 NS
我根据戈登的解决方案采用了以下内容
ORDER BY (CASE when value REGEXP '^LS' then 1 else 0 end) DESC , CAST( value as decimal(20,2)) DESC
它可以部分工作,但带有文本的字段排序不正确。它回来时为:
LS0 NS
LS3 May-15
LS2 Jun-15
LS4 Apr-15
关于如何根据上述 ORDER BY 对值与文本进行子排序有什么想法吗?
最佳答案
如果您希望数字放在最后,您可以指定:
order by (case when value REGEXP '^[-]?[0-9]+$' then 1 else 0 end),
value asc
对于降序:
order by (case when value REGEXP '^[-]?[0-9]+$' then 1 else 0 end) desc,
value desc
编辑:
您问题中的数字都是一位数。您的评论引入了另一个问题。您可以将其处理为:
order by (case when value REGEXP '^[-]?[0-9]+$' then 1 else 0 end) desc,
(value + 0) desc, value desc
value + 0
根据前导数字将值转换为数字。如果没有,则值为 0。
关于MySQL 自然排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32553921/