我正在尝试按数据库中值 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
等等
我正在尝试按数据库中值 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
等等
当正整数存储为 时,按正整数排序的一种方法是先按varchar
长度排序,然后按值排序:
order by len(registration_no), registration_no
这在列可能包含非数字值时特别有用。
注意:在某些数据库中,可能会调用获取字符串长度的函数length()
而不是len()
.
ORDER_BY cast(registration_no as unsigned) ASC
将值显式转换为数字。实现相同目标的另一种可能性是
ORDER_BY registration_no + 0 ASC
这将强制进行隐式对话。
实际上,您应该检查表定义并进行更改。您可以将数据类型更改为int
这样
ALTER TABLE your_table MODIFY COLUMN registration_no int;
如果您使用的是 SQL Server:
ORDER_BY cast(registration_no as int) ASC
ORDER_BY cast(registration_no as unsigned) ASC
给出带有警告的期望结果。
因此,最好去
ORDER_BY registration_no + 0 ASC
获得没有任何 SQL 警告的干净结果。
我假设您的列类型是 STRING(CHAR、VARCHAR 等),并且排序过程将其排序为字符串。您需要做的是将值转换为数值。如何做到这一点取决于您使用的 SQL 系统。
我更喜欢对数据做一个“PAD”。MySql 将其称为 LPAD,但您可以在 SQL Server 中按自己的方式做同样的事情。
ORDER BY REPLACE(STR(ColName, 3), SPACE(1), '0')
此公式将根据列的长度 3 提供前导零。此功能在 ORDER BY 之外的其他情况下非常有用,因此我想提供此选项。
结果:1 变为 001,10 变为 010,而 100 保持不变。
有时,您无法选择将数字与文本混合存储。在我们的一个应用程序中,我们用于电子商务网站的网站主机会从列表中动态生成过滤器。除了显示的文本外,没有按任何字段排序的选项。当我们希望过滤器建立在一个包含 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
这个问题只是因为您已经在 CHAR、VARCHAR 或 TEXT 数据类型中声明了列。只需将数据类型更改为 INT、BIGINT 等。这将解决您自定义排序的问题。