在MySQL中以类似Excel的方式排序varchar列

时间:2010-11-09 20:25:52

标签: sql mysql natural-sort

我有一个varchar列,其中包含混合数据字符串,整数,小数,空字符串和空值。我想以与Excel相同的方式对列进行排序,首先对数字进行排序,然后对字符串进行排序。例如:

  • 1
  • 2
  • 3
  • 3.5
  • 10
  • 11
  • 12
  • 阿兰
  • 鲍勃
  • 卡尔
  • (空白/空)
  • (空白/空)

我尝试过像'ORDER BY my_column + 0'那样对数字进行正确排序但不对字符串进行排序。我希望有人可能知道实现这一目标的有效方法。

MartinofD的建议大部分都有效,如果我稍微扩展一下,我可以得到我想要的东西:

选择FROM测试 订购 一个IS NULL或a ='', a<>'0'和a = 0, 一个+ 0, 一个;

虽然很难看,但我不确定是否有更好的选择。

2 个答案:

答案 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;

然而,欢迎任何更有效/更优雅的解决方案。