sql - 以类似 Excel 的方式在 MySQL 中对 varchar 列进行排序

标签 sql mysql natural-sort

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

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

我试过执行类似“ORDER BY my_column+0”的操作,它可以正确排序数字而不是字符串。我希望有人知道实现此目的的有效方法。

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

从测试中选择一个 订购方式 a 为 NULL 或 a='', a<>'0' AND a=0, 一个+0, 一个;

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

最佳答案

那是因为 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)

关于sql - 以类似 Excel 的方式在 MySQL 中对 varchar 列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4138229/

相关文章:

sql - 如何从另一个表中获取具有最旧值的项目列表

c# - 加密c#和mysql之间的数据流量

mysql - 为了更快的查询应该创建多少索引

sql - 混合字数串的人性化或自然数排序

sql - 仅选择具有最大日期的行

java - Spring Data JPA Native Query N+1问题

r - 如何在 R 中执行自然(词典)排序?

MySQL ORDER_BY 字符串中的部分整数

sql - 在 SQL 中如何使检查约束不区分大小写?

php - 获取 Twig 值内连接sql