我正在尝试按数据库中的数字列排序,其值为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
等
答案 0 :(得分:106)
通过正整数排序的一种方式,当它们存储为varchar
时,首先按长度排序,然后按值排序:
order by len(registration_no), registration_no
当列可能包含非数字值时,此功能特别有用。
注意:在某些数据库中,获取字符串长度的函数可能称为length()
而不是len()
。
答案 1 :(得分:53)
ORDER_BY cast(registration_no as unsigned) ASC
显式将值转换为数字。实现相同目标的另一种可能性是
ORDER_BY registration_no + 0 ASC
会强制进行隐含的对话。
实际上你应该检查表定义并进行更改。您可以将数据类型更改为int
,如下所示
ALTER TABLE your_table MODIFY COLUMN registration_no int;
答案 2 :(得分:11)
如果您使用的是SQL Server:
ORDER_BY cast(registration_no as int) ASC
答案 3 :(得分:2)
我假设您的列类型是STRING(CHAR,VARCHAR等),并且排序过程将其排序为字符串。您需要做的是将值转换为数值。如何操作将取决于您使用的SQL系统。
答案 4 :(得分:1)
我更喜欢做一个" PAD"对数据。 MySql将其称为LPAD,但您可以在SQL Server中执行相同的操作。
ORDER BY REPLACE(STR(ColName,3),SPACE(1),' 0')
此公式将根据列的长度为3提供前导零。此功能在ORDER BY之外的其他情况下非常有用,因此这就是我想提供此选项的原因。
结果:1变为001,10变为010,而100保持不变。
答案 5 :(得分:1)
ORDER_BY cast(registration_no as unsigned) ASC
通过警告给出期望的结果。
因此,最好去
ORDER_BY registration_no + 0 ASC
在没有任何SQL警告的情况下获得干净的结果。
答案 6 :(得分:0)
有时候你不能选择存储与文字混合的数字。在我们的一个应用程序中,我们用于电子商务网站的网站主机使得过滤器动态地不在列表中。除了显示的文本之外,没有选项可以按任何字段排序。当我们想要从列表中建立过滤器之类的东西时 2"到8" 9"至12" 13"至15"等等,我们需要它来排序2-9-13,而不是13-2-9,就像读取数值时一样。因此,我使用SQL Server Replicate函数以及最长数字的长度来填充带有前导空格的任何较短数字。现在20在3之后排序,依此类推。
我正在使用一个视图,它给了我项目类型和类的最小和最大长度,宽度等,这里是我如何处理文本的示例。 (LB n 低,LB n 高是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
答案 7 :(得分:0)
此问题仅是因为您已在CHAR,VARCHAR或TEXT数据类型中声明了该列。只需将数据类型更改为INT,BIGINT等即可。这将解决您的自定义排序问题。