【问题标题】:Order by string returns wrong order按字符串排序返回错误的顺序
【发布时间】:2020-04-11 14:36:02
【问题描述】:

我正在使用名为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

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

【问题讨论】:

  • 为什么每个 ItemCode 都使用“ItemCode”这个词?你不能单独使用代码(数字)吗?那里没用。

标签: sql-server sql-server-2008


【解决方案1】:

你可以按数字排序

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

【讨论】:

  • 谢谢萨米,不幸的是,当我有一个完全是字符串的字段,不包含任何数字时,我收到异常 Msg 245, Level 16, State 1, Line 1 转换 varchar 值时转换失败'940Β' 到数据类型 int。
【解决方案2】:

这是基于this 的预期行为:

这是字典排序,基本上意味着语言 将变量视为字符串并逐个字符进行比较

你需要使用这样的东西:

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

【讨论】:

  • 谢谢!在我的字符串之前用零填充的答案似乎很好用!
猜你喜欢
  • 2021-03-15
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多