按字符串排序 returns 顺序错误
Order by string returns wrong order
我正在使用名为 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
我应该将列转换为数字吗?我还提到我有一些字段不包含数字。
这是预期的行为,基于 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
我正在使用名为 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
我应该将列转换为数字吗?我还提到我有一些字段不包含数字。
这是预期的行为,基于 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