SQL Order无法正常工作

Ath*_*hul 1 sql sql-order-by sql-server-2008

我有一张这样的桌子

 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]
Run Code Online (Sandbox Code Playgroud)

我试图以降序从MaxDD列获取数据

SELECT  distinct "MaxDD" FROM [tbl_LandRigs] ORDER BY "MaxDD" Desc
Run Code Online (Sandbox Code Playgroud)

但是这会按以下顺序返回数据 在此输入图像描述 根据我的计算,4000必须是第一个值,其次是其他人.但是这个结果让我很震惊.任何人都可以帮助我吗?

Tim*_*ter 5

您将它们存储为text(nvarchar),这就是您获得词法顺序的原因.这意味着每个角色从左到右相互比较.因此4000"高于" 30000(最后的零无关紧要,因为前4个已经高于3).

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