2010-07-01 131 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