2013-06-05 263 views
2

我正在使用SQL Server 2008.SQL Server - 是否有爲數字提供自然順序的排序規則?

我有一個表類型爲VarChar的表。它目前充滿了實際上代表數字的字符串。不幸的是,該列必須保持爲VarChar ('1', '2' ... , '1000')

我希望查詢該字段的最大數值,但由於這是一個VarChar我得到最大的字典,而不是最大的自然順序。

我想我會嘗試使用COLLATE子句該查詢解決這個問題,並切換到這個link

  1. 提供類似數字自然順序排序規則是否有這樣的排序規則的SQL Server如果是的話,應該查詢什麼?
  2. 如果這樣的排序規則存在,我應該使用這種方法還是應該使用cast?

謝謝。

+0

沒有,有沒有這樣的 「神奇」 的排序規則。如果它以字符串形式存儲 - 它將按字符串排序。期。如果它是一個數字,它應該被**存儲**爲一個數字...... –

回答

2

沒有對數字進行自然排序的排序選項。

但是,如果所有值均爲整數,則可以將該值轉換爲整數。

嘗試像

SELECT MAX(CAST (Value as int)) 
FROM MyTable 
+0

謝謝你回答這個問題!你能解釋爲什麼沒有這樣的整理嗎? – Oren

+0

@Oren排序規則提供對不同語言的支持,因此可以處理字符而不是數字。你只需要告訴SQL某些東西是一個數字來激活數字排序算法。當你需要自然排序的字母和數字混合時,事情會變得複雜,但不要去那裏。 – Kami

2

剛一說明,第三個選擇是使用一個持久化計算列 - 這是轉換爲數字

這樣,它只能投一次的價值 - 在創建或更新

-- Create Table with computed column 
CREATE TABLE [dbo].[CCtest] 
(
[myString] [varchar] NULL, 
[myInt] AS (cast(myString as int)) PERSISTED 
) 
GO 

然後可以在計算列上創建一個索引。

2

如果所有值都是數值型,您可以簡單地按照轉換爲int的值進行排序,而不需要更改排序規則或表結構;

SELECT * FROM test ORDER BY CONVERT(INT, value); 

An SQLfiddle to test with