1

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

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

我尝试过像“ORDER BY my_column+0”这样的东西,它可以正确地对数字进行排序,但不能对字符串进行排序。我希望有人可能知道实现此目的的有效方法。

MartinofD 的建议在很大程度上是有效的,如果我稍微扩展一下,我就能得到我想要的:

SELECT a FROM test ORDER BY a IS NULL OR a='', a<>'0' AND a=0, a+0, a;

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

4

2 回答 2

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)
于 2010-11-09T20:35:09.870 回答
1

这有效:

SELECT a FROM test ORDER BY a IS NULL OR a='', a<>'0' AND a=0, a+0, a;

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

于 2010-11-11T00:46:47.010 回答