2013-05-13 28 views
43

我试图按数据库中的数字列进行排序,其值为1-999用于按数字排序的SQL - 1,2,3,4等而不是1,10,11,12

当我用

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

+10

你列是VARCHAR类型的,因为其中的你面对此行为。 – Meherzad 2013-05-13 10:19:26

+0

registration_no列的数据类型是什么? – 2013-05-13 10:19:41

+4

使用'order by registration_no + 0 asc'来解决您的问题。 – Meherzad 2013-05-13 10:20:32

回答

35
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

我假设你的列类型是STRING(CHAR,VARCHAR等)和排序过程的排序它作为一个字符串。你需要做的是将值转换为数值。如何做到这一点将取决于你使用的SQL系统。由正整数,当它们被存储为varchar订购

66

的一种方法,是由长度第一和然后将该值订购:

order by len(registration_no), registration_no 

这是当列可能包含非数字是特别有用值。

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

+1

哇。用语言表达我的敬畏 – Lordbalmon 2017-05-10 02:31:58

+0

这在所有情况下都不起作用。在头顶上,不起作用的情况是整数的混合;负数,带前导零的数字,带分数的数字以及组合的字数。 – 2017-06-14 14:41:19

+7

@ Knickerless-Noggins。 。 。阅读答案的第一句话。我认为这很清楚。 – 2017-06-14 16:06:41

8

如果您正在使用SQL Server:

ORDER_BY cast(registration_no as int) ASC 
+0

非常好,thx :) – Zombyii 2017-10-16 14:52:13

1

我宁愿做一个 “PAD” 的数据。 MySql将其称为LPAD,但您可以在SQL Server中按照自己的方式做同样的事情。

ORDER BY REPLACE(STR(COLNAME,3),空间(1), '0')

此公式将提供主要基于的3列的长度的零此功能是在其它情况下是非常有用的ORDER BY之外,所以这就是为什么我想提供这个选项。

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

0

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

我正在处理一个视图,该视图为我提供了项目类型和类的最小和最大长度,宽度等,这里是我如何完成文本的一个示例。 (LB Ñ低和LB Ñ高是低和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 
相关问题