2

我有一张这样的桌子

 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

但这会按以下顺序返回数据 在此处输入图像描述 根据我的计算,4000 必须是第一个值,然后是其他值。但是这个结果让我感到惊讶。有人可以帮我解决这个问题吗?

4

3 回答 3

5

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

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

于 2013-08-27T08:56:43.140 回答
3

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

于 2013-08-27T08:50:05.170 回答
0

此行为是由于 nvarchar 类型造成的。

试试这个:

SELECT  distinct "MaxDD" FROM [tbl_LandRigs] ORDER BY CAST ("MaxDD" as Int)
于 2013-08-27T08:52:06.443 回答