2013-08-27 6 views
1

У меня есть таблица, как этот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 должно быть первым значением, за которым следуют другие. Но эти результаты поразили меня. Может ли кто-нибудь помочь мне в этом?

+1

Вы храните их в виде текста ('nvarchar'), поэтому вы получаете [lexographic order] (http://en.wikipedia.org/wiki/Lexicographic_order) –

ответ

5

Вы храните их в виде текста (nvarchar), поэтому вы получите lexographical order. Это означает, что каждый персонаж сравнивается друг с другом слева направо. Следовательно, 4000 «выше», чем 30000 (последний нуль не имеет значения, так как первый 4 уже выше, чем 3).

Таким образом, правильный способ хранения - это числовое значение. Однако это кажется невозможным, поскольку вы также используете такие значения, как 16.000 with 4.1/2"DP. Тогда я бы добавил еще один столбец, один для числового значения, которое вы хотите заказать, а другое для текстового представления.

3

В качестве MaxDD является varchar, а не числом, которое сортируется в лексикографическом порядке (то есть упорядочено первым символом, затем вторым, ...), а не численным. Вы должны преобразовать его в числовое значение

0

Это поведение связано с типом nvarchar.

Попробуйте это:

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

, это не удастся, так как' MaxDD' имеет хотя бы один не числовое значение '16.000 с 4.1/2" DP' –

Смежные вопросы