如何对表示数字的字符串数据进行排序

时间:2016-09-03 18:32:28

标签: sql sorting

我的客户端有一组数字数据存储在数据库的字符串字段中。所以当然它没有正确排序。这些行的排序如下:

105    
3   
44

当它们应该这样排序时:

3    
44    
105

这是一个非常遗留的数据库,我根本无法改变它。我也无法更改使用数据库的软件。客户端不拥有它或拥有源代码。它从来没有像他们想要的那样工作。但是,我可以使用一个未使用的字符串字段进行排序(只能对少量字段进行排序。)

我想要做的是获取输入数据,从中导出一个字符串,并将新字符串存储在未使用的字段中,这样当数据按此新数据排序时,原始数据会正确排序,即,数字上。

因此,对于一个过于简单的例子,如果算法产生了以下新数据:

105   -> c
3     -> a
44    -> b

然后,当第二列被排序时,第一列看起来“正确”。

棘手的一点是,当新行添加到数据库时,它们也必须正确排序,而不必重新生成所有行的排序数据。这是我的大脑扭曲的问题的一部分。我不确定它实际上是否可能。

您可以假设该数字永远不会超过5位数。

我意识到这是一个完全的问题,但由于我无法改变系统,我必须找到一个解决方案,而不是一个高质量的解决方案。欢迎来到现实世界。

~~~~~~~~~~~~~~~~~~~~~~ S O L U T I O N ~~~~~~~~~~~~~~~~~~

我不认为这是一个不常见的问题,所以这是戈登解决方案的结果:

mysql> select * from t order by new;
+------+------------+
| orig | new        |
+------+------------+
| 3    | 0000000003 |
| 44   | 0000000044 |
| 105  | 0000000105 |
+------+------------+

2 个答案:

答案 0 :(得分:1)

在大多数数据库中,您可以这样做:

order by cast(col as int)

这会将字符串表示转换为数字并将其用于排序。不需要额外的列。如果你添加一个,我建议添加一个数字列来包含实际值。

如果您真的想在未使用的字段中存储某些内容,则可以留下该号码。如何做到这一点取决于数据库,但这是一个典型的方法:

update t
    set unused = right(concat('0000000000', col), 10);

并非所有数据库都支持这两个特定功能,但所有数据库都以某种方式提供此基本功能。

答案 1 :(得分:0)

尝试类似

的内容
SELECT column1 FROM table1 ORDER BY LENGTH(column1) ASC, column1 ASC

(调整环境的列和表名称。) 这只是一个黑客攻击,但只要字符串列中的“数字”只是自然的非负数字就行。

如果您正在寻找更复杂的方法或算法,请尝试与您的DBMS一起搜索natural sort