41

我有一列数字存储为字符。当我为此列执行 ORDER BY 时,我得到以下信息:

100
131
200
21
30
31000

如何以数字方式订购这些字符?我需要转换一些东西还是已经有一个 SQL 命令或函数?

谢谢你。

4

5 回答 5

88

试试这个:

ORDER BY CAST(thecolumn AS int)
于 2009-01-28T23:26:39.750 回答
28

这对我有用:

ORDER BY ABS(column_name)
于 2011-12-18T20:07:05.667 回答
4

在某些情况下,这可能是一个很好的匹配:

ORDER BY LENGTH(column_name), column_name

特别是如果您有一列包含所有数字或字母和数字混合但长度相同的列。

于 2018-12-18T16:58:26.510 回答
2

这是在“自然排序”中排序数字字符串的问题(如果您在 Google 上查找“自然排序”,您会发现很多东西)。本质上将字符串转换为 int 并对结果值进行排序应该可以修复它。

于 2009-01-28T23:27:59.233 回答
1

原因是对于 char 数据类型,您将行排序为字符串。

这个想法ORDER BY CAST()是正确的,但是随着返回结果数量的增加,它的性能会下降。

如果此列中只有数字数据,最佳做法是找到合适的数字数据类型并更改它。

如果您确实无法更改列并且发现自己遇到性能问题,我建议您使用包含转换为整数的值的排序顺序列(将空值转换为适当的值)。

索引排序顺序列,理想情况下,将触发器添加到 CHAR 列,以便对 char 值的插入或更新触发对整数值的更新。

于 2009-01-29T11:10:32.913 回答