我正在尝试按数据库中的数字列排序,其值为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
我假设您的列类型是STRING(CHAR,VARCHAR等),并且排序过程将其排序为字符串。您需要做的是将值转换为数值。如何操作将取决于您使用的SQL系统。
我更喜欢对数据做一个“PAD”。 MySql将其称为LPAD,但您可以在SQL Server中执行相同的操作。
ORDER BY REPLACE(STR(ColName,3),SPACE(1),'0')
此公式将根据Column的长度为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之后排序,依此类推。
我正在使用一个视图,它给出了项类型和类的最小和最大长度,宽度等,这是我如何完成文本的示例。 (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
ORDER_BY cast(registration_no as unsigned) ASC
通过警告给出所需的结果。
因此,最好去
ORDER_BY registration_no + 0 ASC
为了一个干净的结果没有任何SQL警告。