102

我正在尝试按数据库中值 1-999 的数字列进行排序

当我使用

ORDER_BY registration_no ASC

我明白了……

1
101
102
103
104
105
106
107
108
109
11
110
Etc…

所以它似乎是按与数字相反的第一个数字排序。

如果我想按价值订购,有谁知道使用什么 SQL?所以1,2,3,4,5,6等等

4

8 回答 8

161

当正整数存储为 时,按正整数排序的一种方法是先按varchar长度排序,然后按值排序:

order by len(registration_no), registration_no

这在列可能包含非数字值时特别有用。

注意:在某些数据库中,可能会调用获取字符串长度的函数length()而不是len().

于 2013-05-13T11:23:42.173 回答
70
ORDER_BY cast(registration_no as unsigned) ASC

将值显式转换为数字。实现相同目标的另一种可能性是

ORDER_BY registration_no + 0 ASC

这将强制进行隐式对话。

实际上,您应该检查表定义并进行更改。您可以将数据类型更改为int这样

ALTER TABLE your_table MODIFY COLUMN registration_no int;
于 2013-05-13T10:19:17.500 回答
14

如果您使用的是 SQL Server:

ORDER_BY cast(registration_no as int) ASC
于 2015-04-03T19:17:33.107 回答
7
ORDER_BY cast(registration_no as unsigned) ASC

给出带有警告的期望结果。

因此,最好去

ORDER_BY registration_no + 0 ASC

获得没有任何 SQL 警告的干净结果。

于 2019-03-04T11:36:09.723 回答
2

我假设您的列类型是 STRING(CHAR、VARCHAR 等),并且排序过程将其排序为字符串。您需要做的是将值转换为数值。如何做到这一点取决于您使用的 SQL 系统。

于 2013-05-13T10:20:32.580 回答
1

我更喜欢对数据做一个“PAD”。MySql 将其称为 LPAD,但您可以在 SQL Server 中按自己的方式做同样的事情。

ORDER BY  REPLACE(STR(ColName, 3), SPACE(1), '0') 

此公式将根据列的长度 3 提供前导零。此功能在 ORDER BY 之外的其他情况下非常有用,因此我想提供此选项。

结果:1 变为 001,10 变为 010,而 100 保持不变。

于 2016-08-19T17:41:30.100 回答
1

有时,您无法选择将数字与文本混合存储。在我们的一个应用程序中,我们用于电子商务网站的网站主机会从列表中动态生成过滤器。除了显示的文本外,没有按任何字段排序的选项。当我们希望过滤器建立在一个包含 2" 到 8" 9" 到 12" 13" 到 15" 等内容的列表中时,我们需要它来排序 2-9-13,而不是 13-2-9读取数值。因此,我使用 SQL Server Replicate 函数以及最长数字的长度来用前导空格填充任何较短的数字。现在 20 排在 3 之后,依此类推。

我正在使用一个视图,该视图为我提供了项目类型和类的最小和最大长度、宽度等,这是我如何处理文本的示例。(LB n Low 和 LB n High 是 5 个长度括号的低端和高端。)

REPLICATE(' ', LEN(LB5Low) - LEN(LB1High)) + CONVERT(NVARCHAR(4), LB1High) + '" and Under' AS L1Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB2Low)) + CONVERT(NVARCHAR(4), LB2Low) + '" to ' + CONVERT(NVARCHAR(4), LB2High) + '"' AS L2Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB3Low)) + CONVERT(NVARCHAR(4), LB3Low) + '" to ' + CONVERT(NVARCHAR(4), LB3High) + '"' AS L3Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB4Low)) + CONVERT(NVARCHAR(4), LB4Low) + '" to ' + CONVERT(NVARCHAR(4), LB4High) + '"' AS L4Text,
CONVERT(NVARCHAR(4), LB5Low) + '" and Over' AS L5Text
于 2017-08-23T21:24:06.760 回答
1

这个问题只是因为您已经在 CHAR、VARCHAR 或 TEXT 数据类型中声明了列。只需将数据类型更改为 INT、BIGINT 等。这将解决您自定义排序的问题。

于 2019-11-27T13:35:03.897 回答