Если вы хотите, чтобы он сортировался как числа, вам придется преобразовать его в числа.
Проверьте, что список чисел в столбце nVarChar
сортируется:
With MyTable AS
(
Select Cast ('1' as nVarChar) nVarCharColumn UNION
Select '100' UNION
Select '99'
)
Select *
From MyTable
Order by 1
Логически 99 должно предшествовать 100, верно?Но он сортируется по nVarChar за раз, поэтому первая 1 из 100 меньше первой 9 и, следовательно, она предшествует 99.
nVarCharColumn
------------------------------
1
100
99
(3 row(s) affected)
Если вы CAST, то вы получите желаемый результат
With MyTable AS
(
Select Cast ('1' as nVarChar) nVarCharColumn UNION
Select '100' UNION
Select '99'
)
Select *
From MyTable
Order by CAST (nVarCharColumn as Int)
Вот правильный вывод
nVarCharColumn
------------------------------
1
99
100
(3 row(s) affected)
Вот поворот таблицы.Что, если в столбце также есть строковое значение?
;With MyTable AS
(
Select Cast ('1' as nVarChar) nVarCharColumn UNION
Select '100' UNION
Select '99' UNION
Select 'String Value'
)
Select *
From MyTable
Order by CAST (nVarCharColumn as Int)
Ошибка !!
Msg 245, Level 16, State 1, Line 22
Conversion failed when converting the nvarchar value 'String Value' to data type int.
Итак, часть SORT
проверяет IsNumeric
- не нужно делатьто же самое в SELECT
части.
With MyTable AS
(
Select Cast ('1' as nVarChar) nVarCharColumn UNION
Select '100' UNION
Select '99' UNION
Select 'String Value'
)
Select *
From MyTable
Order by CAST ( Case When ISNUMERIC (nVarCharColumn)=1 Then nVarCharColumn Else -99 End as Int)
Получите правильный вывод
nVarCharColumn
------------------------------
String Value
1
99
100
(4 row(s) affected)