我的客户端有一组数字数据存储在数据库的字符串字段中。所以当然它没有正确排序。这些行的排序如下:
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 |
+------+------------+
答案 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。