按字符串排序 returns 顺序错误

Order by string returns wrong order

我正在使用名为 ItemCode 的列。 ItemCodeVarchar(50) 类型。 这是我的查询

Select * from Inventory order by ItemCode

所以,现在我的结果看起来像

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

等等。 我怎样才能像下面的例子那样订购我的字符串?

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

我应该将列转换为数字吗?我还提到我有一些字段不包含数字。

这是预期的行为,基于 this

that is lexicographic sorting which means basically the language treats the variables as strings and compares character by character

你需要使用这样的东西:

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

您可以按数字订购

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)

注意:由于您使用 SQL Server 2008 标签标记了您的 Q,因此您应该尽快升级,因为它已不受支持。

更新:

由于您没有提供良好的样本数据,我只是猜测。 这是另一种可以满足您要求的方法

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