SQL认为100小于56

时间:2014-04-23 14:56:34

标签: sql

我正在Sequel Pro中排序列表并且它没有正确排序。这是查询:

Select personID, yearID, x, y
from Table
Where x>=25
order by y asc

这就是我得到的:

playerID    yearID  x    y

****    1930    40  170
****    1921    59  171
****    1930    41  174
****    1938    50  175
****    1927    47  175
****    1937    40  183
****    1931    46  184
****    1930    56  191
****    2002    27  56
****    1973    26  56
****    2008    25  56

表格在两个方向上延伸 - 它从顶部开始,y = 100,在y = 99的底部结束。显然它认为3位数字低于2位数字。但为什么?我该如何解决这个问题?

此外,y是类型VARCHAR,长度为255.

5 个答案:

答案 0 :(得分:3)

您所遇到的是词典排序。这意味着,因为您的字段是varchar而不是像int这样的数字类型,服务器并不知道您实际处理数字。它不是按数值排序(你想要的),而是进行正常的字母排序。 1出现在5之前,因此首先排序。

您问题的真正解决方案是为您的字段使用正确的数据类型。如果您的数据是数字,请使用适当的数字类型(即int表示整数值,floatdouble表示浮点值,decimal表示十进制值,等等。 )。如果这样做,排序将按预期工作。

另一种方法是在order by子句中执行转换以强制按数字排序。

Select personID, yearID, x, y
from Table
Where x>=25
order by convert(int, y) asc

但你应该真的修复字段;这个解决方案只是一个创可贴。

答案 1 :(得分:2)

您只需要在排序前将Y的值转换为数字。像这样:

Select personID, yearID, x, y
from Table
Where x>=25
order by cast(y as int) asc

如果Y中的所有内容都不能转换为整数,则会出现问题。

答案 2 :(得分:1)

由于y字段是文本,因此值56应该位于值191之后是正确的。这就是文本的排序方式。

如果要对文本所代表的数值进行排序,则必须在对它们进行排序时将每个值转换为数字:

Select personID, yearID, x, y
from Table
Where x>=25
order by cast(y as signed integer) asc

答案 3 :(得分:0)

CAST VARCHARNumeric,它会起作用: -

Select personID, yearID, x, y
from Table
Where x>=25
order by CAST(y AS Numeric(10,0)) asc

答案 4 :(得分:0)

SELECT字段,CONVERT(y,UNSIGNED INTEGER)AS ynum 从表 订购ynum;