按编号排序的SQL - 1,2,3,4等而不是1,10,11,12

问题描述 投票:62回答:7

我正在尝试按数据库中的数字列排序,其值为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

sql sql-order-by
7个回答
110
投票

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

order by len(registration_no), registration_no

当列可能包含非数字值时,这尤其有用。

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


54
投票
ORDER_BY cast(registration_no as unsigned) ASC

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

ORDER_BY registration_no + 0 ASC

这将强制进行隐含的对话。

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

ALTER TABLE your_table MODIFY COLUMN registration_no int;

11
投票

如果您使用的是SQL Server:

ORDER_BY cast(registration_no as int) ASC

2
投票

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


1
投票

我更喜欢对数据做一个“PAD”。 MySql将其称为LPAD,但您可以在SQL Server中执行相同的操作。

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

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

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


1
投票

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

我正在使用一个视图,它给出了项类型和类的最小和最大长度,宽度等,这是我如何完成文本的示例。 (LBnLow和LBnHigh是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

1
投票

ORDER_BY cast(registration_no as unsigned) ASC

通过警告给出所需的结果。

因此,最好去

ORDER_BY registration_no + 0 ASC

为了一个干净的结果没有任何SQL警告。

© www.soinside.com 2019 - 2024. All rights reserved.