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