Вопрос

У меня смешанные данные в столбце 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, поэтому мой синтаксис может быть совершенно неверным :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top