У меня смешанные данные в столбце nvarchar (слова и числа). Это самый быстрый способ отсортировать данные в этом столбце в числовом порядке.
Пример результата:





Брось это.
SELECT * FROM foo ORDER BY CAST(somecolumn AS int);
Прошло некоторое время с тех пор, как я коснулся SQL Server, поэтому мой синтаксис может быть полностью неправильным :)
Вы можете обрабатывать данные как буквенно-цифровые или числовые, но не оба одновременно. Я не думаю, что то, что вы пытаетесь сделать, возможно, модель данных настроена неправильно.
I don't think what you're trying to do is possible
Этот пример отлично работает
SELECT * FROM TableName
ORDER BY CASE WHEN 1 = IsNumeric(ColumnName) THEN Cast(ColumnName AS INT) END
Результат:
Но сначала мне нужны числа.
- проверить наличие
если существует (выберите * из dbo.sysobjects, где [id] = object_id (N'dbo.t ') AND objectproperty (id, N'IsUserTable') = 1)
выпадающая таблица dbo.t
идти
--создать пример таблицы
создать таблицу dbo.t (c varchar (10) not null)
не устанавливать счет
--заполнить пример таблицы
вставить в значения 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
по порядку, когда isnumeric (c) = 1, затем 0, иначе 1 конец,
случай, когда isnumeric (c) = 1, затем приведите (c как int) иначе 0 end,
c
Кто-то отклонил это предложение. но не оставил причины, почему. Это правильное решение озадачено?
Использовать это:
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. Возможно, это будет не быстро.
Что произошло при использовании только ORDER BY CASE WHEN 1 = IsNumeric (ColumnName) THEN Cast (ColumnName AS INT) END Это быстрее.
Если вы оставили свои числа с нулями и отсортируете их, вы получите желаемый результат. Вам нужно убедиться, что количество нулей, которые вы вводите, соответствует размеру столбца 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 возвращала один и тот же тип данных, иначе вы получите неправильные результаты или ошибку.
Это должно работать:
select * from Table order by ascii(Column)
У меня смешанные данные в столбце nvarchar (слова и числа)