1

我的数据库中有一些字符串。其中一些具有数值(但当然是字符串格式)。我正在显示按升序排列的这些值。

所以我们知道,对于字符串值,例如 10 大于 2,这是正常的。我在问是否有任何解决方案可以在 2 之后显示 10,而不更改代码或数据库结构,只更改数据。

例如,如果我必须显示从 1 到 10 的值,我将拥有:

  • 1
  • 10
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

我想要的是

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

是否有可能添加“将被解释为大于 9 的不可见字符或字符串”。如果我放 a10 而不是 10,a10 将在最后,但是否有任何不可见或不可见的字符。

所以,我再说一遍,我不是在寻找编程或数据库结构解决方案,而是寻找一种简单的解决方法。

4

3 回答 3

2

您可以尝试将值转换为数字,然后按它排序:

select col
from yourtable
order by cast(col AS UNSIGNED)

请参阅带有演示的 SQL Fiddle

于 2013-01-10T10:56:29.590 回答
1

您可以尝试将正确数量的零附加到数据的前面:

01
02
03
..
10
11
..
99
于 2013-01-10T10:51:16.420 回答
0

由于您在此列中混合了数字和字母 - 即使不是在单行中 - 您真正想要做的是自然排序。这不是 MySQL 本身可以做的事情。但是,有一些解决方法。我遇到的最好的是:

  1. 按长度排序,然后按值排序。

    SELECT mixedColumn FROM tableName ORDER BY LENGTH(mixedColumn), mixedColumn;

    更多示例参见: http: //www.copterlabs.com/blog/natural-sorting-in-mysql/

  2. 使用辅助列作为排序键,它将包含某种规范化数据(即只有数字或只有字母)。

    CREATE TABLE tableName (mixedColumn varchar, sortColumn int); 插入表名值 ('1',1), ('2',2), ('10',3), ('a',4),('a1',5),('a2',6 ),('b1',7);

    SELECT mixedColumn FROM tableName ORDER BY sortColumn;

    除非您能找到处理订购的好方法,否则这可能很难维护。

当然,如果您能够脱离数据库,您将能够使用来自各种编程语言的自然排序功能。

于 2013-01-11T04:29:19.773 回答