Order by string возвращает неправильный порядок - PullRequest
0 голосов
/ 11 апреля 2020

Я использую столбец с именем ItemCode. ItemCode - это Varchar(50) тип. Вот мой запрос

Select * from Inventory order by ItemCode

Итак, теперь мой результат выглядит как

ItemCode-1
ItemCode-10
ItemCode-2
ItemCode-20

И так далее. Как я могу заказать мою строку, как в примере ниже?

ItemCode-1
ItemCode-2
ItemCode-10
ItemCode-20

Должен ли я преобразовать свой столбец в число? Также я упоминаю, что у меня есть некоторые поля, которые не содержат номера.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Вы можете заказать по номерам как

SELECT Str
FROM
(
    VALUES
    ('ItemCode-1'),
    ('ItemCode-10'),
    ('ItemCode-2'),
    ('ItemCode-20')
) T(Str)
ORDER BY CAST(RIGHT(Str, LEN(Str) - CHARINDEX('-', Str)) AS INT)

Примечание. Поскольку вы пометили свой Q тегом SQL Server 2008, вы должны обновить его как можно скорее, поскольку он не поддерживается.

ОБНОВЛЕНИЕ:

Так как вы не предоставляете хорошие данные выборки, я просто предполагаю. Вот еще один способ удовлетворить ваши требования

SELECT Str
FROM
(
    VALUES
    ('ItemCode-1'),
    ('ItemCode-10'),
    ('ItemCode-2'),
    ('ItemCode-20'),
    ('Item-Code')
) T(Str)
ORDER BY CASE WHEN Str LIKE '%[0-9]' THEN CAST(RIGHT(Str, LEN(Str) - CHARINDEX('-', Str)) AS INT) ELSE 0 END
0 голосов
/ 11 апреля 2020

Это ожидаемое поведение, основанное на this :

, что является лексикографией c сортировки, что означает, что в основном язык обрабатывает переменные как строки и сравнивает символ за символом

Вам нужно использовать что-то вроде этого:

ORDER BY 
CASE WHEN ItemCode like '%[0-9]%' 
THEN Replicate('0', 100 - Len(ItemCode)) + ItemCode
ELSE ItemCode  END
...