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

Kon*_*262 72 sql sql-order-by

我正在尝试按数据库中的数字列排序,其值为1-999

我用的时候

ORDER_BY registration_no ASC
Run Code Online (Sandbox Code Playgroud)

我明白了......

1
101
102
103
104
105
106
107
108
109
11
110
Etc…
Run Code Online (Sandbox Code Playgroud)

所以它似乎是按第一个数字排序,与数字相反.

如果我想按值排序,有谁知道使用什么SQL?所以,1,2,3,4,5,6

Gor*_*off 121

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

order by len(registration_no), registration_no
Run Code Online (Sandbox Code Playgroud)

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

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

  • @ Knickerless-Noggins...阅读答案的第一句话.我觉得很清楚. (10认同)
  • 这并非在所有情况下都有效。从头顶上看,不起作用的情况是整数与的混合;负数、带前导零的数字、带分数的数字以及单词和数字的组合。 (2认同)

jue*_*n d 57

ORDER_BY cast(registration_no as unsigned) ASC
Run Code Online (Sandbox Code Playgroud)

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

ORDER_BY registration_no + 0 ASC
Run Code Online (Sandbox Code Playgroud)

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

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

ALTER TABLE your_table MODIFY COLUMN registration_no int;
Run Code Online (Sandbox Code Playgroud)


小智 12

如果您使用的是SQL Server:

ORDER_BY cast(registration_no as int) ASC
Run Code Online (Sandbox Code Playgroud)


小智 6

ORDER_BY cast(registration_no as unsigned) ASC
Run Code Online (Sandbox Code Playgroud)

给出带有警告的预期结果。

因此,最好去

ORDER_BY registration_no + 0 ASC
Run Code Online (Sandbox Code Playgroud)

对于没有任何 SQL 警告的干净结果。