我正在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.
答案 0 :(得分:3)
您所遇到的是词典排序。这意味着,因为您的字段是varchar
而不是像int
这样的数字类型,服务器并不知道您实际处理数字。它不是按数值排序(你想要的),而是进行正常的字母排序。 1
出现在5
之前,因此首先排序。
您问题的真正解决方案是为您的字段使用正确的数据类型。如果您的数据是数字,请使用适当的数字类型(即int
表示整数值,float
或double
表示浮点值,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
VARCHAR
为Numeric
,它会起作用: -
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;