Сортировка столбца nvarchar по целому - PullRequest
3 голосов
/ 26 сентября 2008

У меня есть смешанные данные в столбце nvarchar (слова и цифры). Какой самый быстрый способ сортировки данных в этом столбце в числовом порядке.

Пример результата:

  • 1
  • 2
  • 3
  • ...
  • 10
  • 11
  • ...
  • аааа
  • AAAB
  • б
  • ба
  • ба
  • ...

Ответы [ 7 ]

11 голосов
/ 26 сентября 2008

Используйте это:

ORDER BY
    CASE WHEN ISNUMERIC(column) = 1 THEN 0 ELSE 1 END,
    CASE WHEN ISNUMERIC(column) = 1 THEN CAST(column AS INT) ELSE 0 END,
    column

Это работает как ожидалось.


Примечание : Вы говорите самый быстрый путь . Этот sql был быстрым для меня, но план выполнения показывает сканирование таблицы с последующим скалярным вычислением. Это может привести к временному результату, содержащему все значения этого столбца с некоторыми дополнительными временными столбцами для результатов ISNUMERIC. Выполнение может быть не быстрым.

3 голосов
/ 26 сентября 2008

Если вы оставите свои цифры нулями и отсортируете их, вы получите желаемый результат. Вам нужно убедиться, что число 0, которое вы дополняете, соответствует размеру столбца varchar.

Взгляните на этот пример ...

Declare @Temp Table(Data VarChar(20))

Insert Into @Temp Values('1')
Insert Into @Temp Values('2')
Insert Into @Temp Values('3')
Insert Into @Temp Values('10')
Insert Into @Temp Values('11')
Insert Into @Temp Values('aaaa')
Insert Into @Temp Values('aaab')
Insert Into @Temp Values('b')
Insert Into @Temp Values('ba')
Insert Into @Temp Values('ba')

Select * From @Temp
Order By Case When IsNumeric(Data) = 1 
              Then Right('0000000000000000000' + Data, 20) 
              Else Data End

Также обратите внимание, что при использовании оператора case важно, чтобы каждая ветвь оператора case возвращала один и тот же тип данных, иначе вы получите неправильные результаты или ошибку.

1 голос
/ 26 сентября 2008

- проверка на наличие
если существует (выберите * из dbo.sysobjects, где [id] = идентификатор_объекта (N'dbo.t ') И свойство объекта (id, N'IsUserTable') = 1)
Drop Table dbo.t
идти

- создать пример таблицы
создать таблицу dbo.t (c varchar (10) не ноль)
установить nocount на

- заполнить пример таблицы
вставить в dbo.t (c) значения ('1')
вставить в dbo.t (c) значения ('2')
вставить в dbo.t (c) значения ('3')
вставить в dbo.t (c) значения ('10 ')
вставить в dbo.t (c) значения ('11')
вставить в dbo.t (c) значения ('aaaa')
вставить в dbo.t (c) значения ('aaab')
вставить в dbo.t (c) значения ('b')
вставить в dbo.t (c) значения ('ba')
вставить в dbo.t (c) значения ('ba')

- вернуть данные
выберите c из dbo.t
порядок в каждом случае, когда числовой (c) = 1, затем 0 или 1 конец,
случай, когда isnumeric (c) = 1, затем приведение (c как int), иначе 0 end,
с

0 голосов
/ 26 сентября 2008

Это должно работать:

select * from Table order by ascii(Column)
0 голосов
/ 26 сентября 2008

Я не думаю, что ты пытаешься сделать возможно

Этот пример отлично работает

SELECT * FROM TableName
ORDER BY CASE WHEN 1 = IsNumeric(ColumnName) THEN Cast(ColumnName AS INT) END

Результат:

  • а
  • б
  • с
  • ...
  • 1
  • 2
  • 3

Но сначала мне нужны цифры.

0 голосов
/ 26 сентября 2008

Вы можете обрабатывать данные как буквенно-цифровые, или числовые, но не оба одновременно. Я не думаю, что вы пытаетесь сделать это возможно, модель данных не настроена должным образом.

0 голосов
/ 26 сентября 2008

В ролях.

SELECT * FROM foo ORDER BY CAST(somecolumn AS int);

Прошло некоторое время с тех пор, как я коснулся SQL Server, поэтому мой синтаксис может быть совершенно неправильным:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...