Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 按字符串排序返回错误的顺序_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 按字符串排序返回错误的顺序

Sql server 按字符串排序返回错误的顺序,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我使用的列名为ItemCodeItemCode是Varchar(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
Varchar(50)
类型。 这是我的问题

Select * from Inventory order by ItemCode
现在我的结果是

ItemCode-1
ItemCode-10
ItemCode-2
ItemCode-20
等等。 如何按照下面的示例对字符串进行排序

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

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

这是一种预期行为,基于:

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

您需要使用以下内容:

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

谢谢Sami,不幸的是,当我有一个完全是字符串的字段,不包含任何数字时,我得到异常消息245,级别16,状态1,当将varchar值“940Β”转换为数据类型int时,第1行转换失败。为什么要对每个ItemCode使用“ItemCode”一词?你不能单独使用代码(号码)吗?那没用,谢谢你!在我的字符串运行之前,你用零填充的答案似乎非常好!