Order By для столбца NVARCHAR в SQL Server - PullRequest
4 голосов
/ 13 февраля 2012

У меня есть столбец NVARCHAR (255) в SQL Server 2005, который содержит буквы или цифры.

Declare @Temp Table(Name NVARCHAR(255))

Insert Into @Temp Values('1')
Insert Into @Temp Values('2')
Insert Into @Temp Values('3')
Insert Into @Temp Values('10')
Insert Into @Temp Values('aaaa')
Insert Into @Temp Values('ccaaaaa')
Insert Into @Temp Values('cca')
Insert Into @Temp Values('cccc')
Insert Into @Temp Values('ccaa')

Select * From  @Temp Order by Name

Этот запрос возвращает неверный результат. Может кто-нибудь объяснить, почему?
Кроме того, может кто-нибудь сказать мне, какой запрос использовать для сортировки значений.
Я хочу получить следующую последовательность:

1
2
3
10
aaaa
cca
ccaa
ccaaaaa
cccc

Спасибо

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

@ Акула показала вам, почему, я покажу вам работу в вашем SELECT, чтобы получить желаемые результаты:

Select * From  @Temp 
Order by 
    case isnumeric(name) 
       when 1 then cast(name as int) 
       else 999999999999999 end, 
    name
3 голосов
/ 13 февраля 2012

Фактический порядок результатов будет таким:

1
10
2
3
aaaa
cca
ccaa
ccaaaaa
cccc

И SQL Server сортирует его так, потому что он сортируется на основе их символьных значений.Другими словами, символ 1 предшествует 2, так как 10 также предшествует 2.

Так что вы получаете странную сортировку, потому что вы упорядочиваете по строковым значениям, не числовое.

РЕДАКТИРОВАТЬ : Пожалуйста, см. ответ Адриана на обходной путь.

...