2013-08-27 123 views
1

我有這樣SQL排序不能正常工作

CREATE TABLE [dbo].[tbl_LandRigs](
    [ID] [int] IDENTITY(700000,1) NOT NULL, 
    [Company] [nvarchar](500) NULL, 
    [Rig] [nvarchar](500) NULL, 
    [RigType] [nvarchar](200) NULL, 
    [DrawWorks] [nvarchar](500) NULL, 
    [TopDrive] [nvarchar](200) NULL, 
    [RotaryTable] [nvarchar](500) NULL, 
    [MudPump] [nvarchar](500) NULL, 
    [MaxDD] [nvarchar](50) NULL, 
    [Operator] [nvarchar](500) NULL, 
    [Country] [nvarchar](200) NULL, 
    [Location] [nvarchar](500) NULL, 
    [OPStatus] [nvarchar](200) NULL, 
    [CreatedDate] [datetime] NULL, 
    [CreatedByID] [int] NULL, 
    [CreatedByName] [nvarchar](50) NULL, 
CONSTRAINT [PK_tbl_LandRigs] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

一個表,我試圖讓降序排列

SELECT distinct "MaxDD" FROM [tbl_LandRigs] ORDER BY "MaxDD" Desc 

從MaxDD列數據但這按照以下順序 返回數據enter image description here 根據我的計算,4000必須是其他人的第一個值。但這個結果使我驚訝。能幫我解決這個問題嗎?

+1

你正在將它們存儲爲文本('nvarchar'),爲什麼你得到[詞法順序](http://en.wikipedia.org/wiki/Lexicographical_order) –

回答

5

您將它們存儲爲文本(nvarchar),這就是爲什麼你lexographical order。這意味着每個角色都從左到右彼此進行比較。因此400030000「更高」(由於前4個已經高於3,因此最後的零不重要)。

所以正確的方法是將它作爲數值存儲。但是,這似乎是不可能的,因爲你也使用像16.000 with 4.1/2"DP這樣的值。然後,我會添加另一列,一個用於您要排序的數字值,另一個用於文本表示。

3

由於MaxDDvarchar,它不是一個按照字典順序排序的數字(即按第一個字符排序,然後第二個排序),而不是數字。您應該將其轉換爲數值

0

此行爲歸因於nvarchar類型。

試試這個:

SELECT distinct "MaxDD" FROM [tbl_LandRigs] ORDER BY CAST ("MaxDD" as Int) 
+0

這將失敗,因爲'MaxDD'至少有一個數字值爲16.000,帶有4.1/2「DP」 –