SQL Order无法正常工作

时间:2013-08-27 08:46:36

标签: sql sql-server-2008 sql-order-by

我有一张这样的表

 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]

我正试图以降序

从MaxDD列中获取数据
SELECT  distinct "MaxDD" FROM [tbl_LandRigs] ORDER BY "MaxDD" Desc

但是这会按以下顺序返回数据 enter image description here 根据我的计算,4000必须是第一个值,其次是其他人。但是这个结果让我很吃惊。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:5)

您将它们存储为文本(nvarchar),这就是您获得lexographical order的原因。这意味着每个角色从左到右相互比较。因此400030000“更高”(最后的零无关紧要,因为前4个已经高于3)。

所以正确的方法是将其存储为数值。但是,这似乎是不可能的,因为您还使用16.000 with 4.1/2"DP之类的值。然后我会添加另一列,一列用于您想要排序的数值,另一列用于文本表示。

答案 1 :(得分:3)

由于MaxDDvarchar,而不是数字,它按字典顺序排序(即按第一个字符排序,然后是第二个,......),而不是数字。您应该将其转换为数值

答案 2 :(得分:0)

此行为是由nvarchar类型引起的。

试试这个:

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