2010-07-01 133 views
7

我有一列通常只有数字(有时是字母,但这不重要)。SQL Server的自然排序?

我怎样才能使它自然排序?

目前排序是这样的:{} 1,10,11,12,2,3,4,5,6,7,8,9

我希望它有点像这样:{1,2 ,3,4,5,6,7,8,9,10,11,12}

回答

6

IsNumeric is“broken”,ISNUMERIC(CHAR(13))返回1,CAST将失败。

使用ISNUMERIC(textval +'e0')。最终代码:

ORDER BY 
    PropertyName, 
    CASE ISNUMERIC(MixedField + 'e0') WHEN 1 THEN 0 ELSE 1 END, -- letters after numbers 
    CASE ISNUMERIC(MixedField + 'e0') WHEN 1 THEN CAST(MixedField AS INT) ELSE 0 END, 
    MixedField 

你可以混合命令参数...

+0

几乎在那里,它不排序非数字它只是将它们无情地添加到最后。我会修改你的查询并接受它 – Malfist 2010-07-01 15:30:42

-3

你有没有使用捆绑:

'排序依据的ColumnName升序'

在查询结束。

+8

这不是一个自然排序,这是一个ASCII排序。 – Malfist 2010-07-01 14:55:28

1

投它。此外,不要忘记使用IsNumeric来确保只返回数字(如果它们包含字母,则很重要;)。

SELECT textval FROM tablename 
WHERE IsNumeric(textval) = 1 
ORDER BY CAST(textval as int) 

此外,转换为将保存最大值的数据类型。

如果您还需要结果集中的非数字,那么只需在其之前或之后追加一个UNION查询,其中IsNumeric = 0(按您想要的顺序排列)。

+0

联盟的问题是,这种排序不是第一级排序。第一类是属性名称,这种类型是通过单元号(通常是数字,但可能是A,B,C,...)联盟会抛出很多 – Malfist 2010-07-01 15:13:12