按数字sorting的SQL – 1,2,3,4等而不是1,10,11,12

我试图通过我的数据库中有一个值为1-999的数字列进行sorting

当我使用

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

一种以正整数进行sorting的方法,当它们以varchar存储时,首先按长度sorting,然后是值:

 order by len(registration_no), registration_no 

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

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

 ORDER_BY cast(registration_no as unsigned) ASC 

明确地将该值转换为数字。 另一个可能实现相同的将是

 ORDER_BY registration_no * 1 ASC 

这将迫使一个隐含的谈话。

其实你应该检查表格的定义并改变它。 您可以像这样将数据types更改为int

 ALTER TABLE your_table MODIFY COLUMN registration_no int; 

如果您使用SQL Server:

 ORDER_BY cast(registration_no as int) ASC 

我假设你的列types是STRING(CHAR,VARCHAR等),sorting过程将它sorting为一个string。 你需要做的是将值转换为数值。 如何做到这一点将取决于你使用的SQL系统。

我更喜欢对数据做一个“PAD”。 MySql把它叫做LPAD,但是你可以用你的方式在SQL Server中做同样的事情。

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

这个公式将提供基于列长度为3的前导零。这个function在ORDER BY之外的其他情况下非常有用,所以我想提供这个选项。

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

有时你只是没有select存储与文本混合的数字。 在我们的一个应用程序中,我们用于电子商务网站的网站主机使得filterdynamic地脱离列表。 除了显示的文本之外,没有任何选项可以sorting。 当我们想要从2到8“9”到12“13”到15“等列表中build立一个filter时,我们需要按照2-9-13而不是13-2-9读取数字值。 所以我使用了SQL Server Replicate函数以及最长的数字来填充所有较短的数字。 现在20在3之后sorting,依此类推。

我正在处理一个视图,这个视图为我提供了项目types和类的最小和最大长度,宽度等,这里是我如何做文本的一个例子。 (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)+'“到'+ CONVERT(NVARCHAR(4),LB3High)+'”'AS L3Text,REPLICATE 'LEN(LB5Low) – LEN(LB4Low))+ CONVERT(NVARCHAR(4),LB4Low)+'“到'+ CONVERT(NVARCHAR(4),LB4High)+'”'AS L4Text,CONVERT(NVARCHAR(4) ,LB5Low)+''和Over'AS L5Text