Сортировка nvarchar столбца SQL Server 2005 - PullRequest
3 голосов
/ 21 июля 2011

При сортировке столбца nvarchar в SQL, который имеет числовое значение, SQL Server возвращает неверную сортировку, и я не знаю, почему!

Есть ли какой-то особый способ, которым SQL Server сортирует столбцы varchar, имеющие числовые значения?

Спасибо

Ответы [ 4 ]

3 голосов
/ 21 июля 2011

Это имеет отказоустойчивый, который будет учитывать не числовые значения и помещать их в конец вашего набора результатов.

SELECT [nvarcharColumn]
FROM [Table]
ORDER BY CAST(ISNULL(NULLIF(ISNUMERIC([nvarcharColumn]),0),2147483647) as INT)
2 голосов
/ 21 июля 2011

Если вы хотите, чтобы он сортировался как числа, вам придется преобразовать его в числа.

Проверьте, что список чисел в столбце 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)
0 голосов
/ 21 июля 2011

Ваше значение сортировки должно быть преобразовано в числовое значение.

ORDER BY CONVERT(INT, YourVarcharCol) ASC

Надеюсь, это поможет,

Джон

0 голосов
/ 21 июля 2011

вы можете набрать приведенные значения в виде, например, int или float

SELECT nVarCharValue FROM table ORDER BY CAST(nVarCharValue AS INT)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...