我有一个varchar列,其中包含混合数据字符串,整数,小数,空字符串和空值。我想以与Excel相同的方式对列进行排序,首先对数字进行排序,然后对字符串进行排序。例如:
我尝试过像'ORDER BY my_column + 0'那样对数字进行正确排序但不对字符串进行排序。我希望有人可能知道实现这一目标的有效方法。
MartinofD的建议大部分都有效,如果我稍微扩展一下,我可以得到我想要的东西:
选择FROM测试 订购 一个IS NULL或a ='', a<>'0'和a = 0, 一个+ 0, 一个;
虽然很难看,但我不确定是否有更好的选择。
答案 0 :(得分:1)
那是因为my_column+0
对于所有字符串(0)都是相等的。
只需使用ORDER BY my_column+0, my_column
mysql> SELECT a FROM test ORDER BY a+0, a;
+-------+
| a |
+-------+
| NULL |
| alan |
| bob |
| carl |
| david |
| 1 |
| 2 |
| 3 |
| 3.5 |
| 10 |
| 11 |
| 12 |
+-------+
12 rows in set (0.00 sec)
如果你严格要求数字高于字符串,这里有一个解决方案(虽然我不确定它在大表上会有多快):
mysql> SELECT a FROM test ORDER BY (a = CONCAT('', 0+a)) DESC, a+0, a;
+-------+
| a |
+-------+
| 1 |
| 2 |
| 3 |
| 3.5 |
| 10 |
| 11 |
| 12 |
| alan |
| bob |
| carl |
| david |
| NULL |
+-------+
12 rows in set (0.00 sec)
答案 1 :(得分:1)
这有效:
SELECT a FROM test ORDER BY a IS NULL OR a='', a<>'0' AND a=0, a+0, a;
然而,欢迎任何更有效/更优雅的解决方案。