按具有条件的子字符串进行SQL排序

按具有条件的子字符串进行SQL排序,sql,sql-server,substring,charindex,Sql,Sql Server,Substring,Charindex,我有如下数据: [Model Number] [Model Number]*1 [Model Number]*4 [Model Number]*10 [Model Number]*13 当我选择它们时,我会按“*”后面的数字来排序,我几乎可以用了,但我不知道如何处理我没有“*”的情况。以下是我查询的最后一部分: ORDER BY CAST(SUBSTRING(COL_NAME, CHARINDEX('*', COL_NAME) + 1, LEN(COL_NAME)) AS INT) DESC

我有如下数据:

[Model Number]
[Model Number]*1
[Model Number]*4
[Model Number]*10
[Model Number]*13
当我选择它们时,我会按“*”后面的数字来排序,我几乎可以用了,但我不知道如何处理我没有“*”的情况。以下是我查询的最后一部分:

ORDER BY 
CAST(SUBSTRING(COL_NAME, CHARINDEX('*', COL_NAME) + 1, LEN(COL_NAME)) AS INT) DESC

感谢您的帮助

以下几个解决方案可以帮助您实现目标:

ORDER BY TRY_CONVERT(int,RIGHT(COL_NAME, NULLIF(CHARINDEX('*',REVERSE(COL_NAME)),0) -1)) DESC;

ORDER BY TRY_CONVERT(int, STUFF(COL_NAME, 1, NULLIF(CHARINDEX('*', COL_NAME),0),'')) DESC;
如果没有
“*”
,则
NULLIF可以解决问题,因为
CHARINDEX
将返回
0
。然后,您不会向
RIGHT
函数传递一个无效(负)值,即
NULL-1=NULL


我个人的偏好是使用
东西
,因为
反向
是一个相当昂贵的功能。

有两个解决方案可以让你得到你想要的:

ORDER BY TRY_CONVERT(int,RIGHT(COL_NAME, NULLIF(CHARINDEX('*',REVERSE(COL_NAME)),0) -1)) DESC;

ORDER BY TRY_CONVERT(int, STUFF(COL_NAME, 1, NULLIF(CHARINDEX('*', COL_NAME),0),'')) DESC;
如果没有
“*”
,则
NULLIF可以解决问题,因为
CHARINDEX
将返回
0
。然后,您不会向
RIGHT
函数传递一个无效(负)值,即
NULL-1=NULL


我个人的偏好是使用
东西
,因为
反转
是一个相当昂贵的功能。

你就快到了,试试这个

declare @t table (col_name varchar(128));
insert into @t (col_name)
values
( '[Model Number]')
, ('[Model Number]*1')
, ('[Model Number]*4')
, ('[Model Number]*10')
, ('[Model Number]*13');

select *
from @t
order by case charindex('*', col_name) when 0 then 0 else cast(substring(col_name, charindex('*', col_name)+1, 10) as int) end desc

你就快到了,试试这个

declare @t table (col_name varchar(128));
insert into @t (col_name)
values
( '[Model Number]')
, ('[Model Number]*1')
, ('[Model Number]*4')
, ('[Model Number]*10')
, ('[Model Number]*13');

select *
from @t
order by case charindex('*', col_name) when 0 then 0 else cast(substring(col_name, charindex('*', col_name)+1, 10) as int) end desc

是否有其他方法可以尝试转换,我认为我的sql Server版本太旧了?@ChristophenSirois
TRY\u CONVERT
可从sql Server 2012获得,因此我希望您能够访问它;SQL Server 2008现在几乎完全不受支持。如果没有,您将不得不使用
转换
,希望您没有像
“[Model Number]*1A”
这样的值。谢谢!转换工作,如果我确保只有INT值在“*”之后,我应该不会有任何问题?不幸的是,这不是我的服务器,它仍然在SQL server 2008上。如果
“*”
后面只有数字字符,那么您不会有任何问题,不会。我的解决方案假定您希望行的顺序为
1,2,3,4…10,11,12…20,21等
(数字顺序),而不是
1,10,11,…2,20,21,22,etc
(字符顺序)。如果您想要后一种订购方式,那么请将
CONVERT
完全去掉。是否有其他方法可以尝试转换,我相信我的sql Server版本太旧了?@ChristophenSirois
TRY\u CONVERT
可从sql Server 2012获得,因此我希望您能够访问它;SQL Server 2008现在几乎完全不受支持。如果没有,您将不得不使用
转换
,希望您没有像
“[Model Number]*1A”
这样的值。谢谢!转换工作,如果我确保只有INT值在“*”之后,我应该不会有任何问题?不幸的是,这不是我的服务器,它仍然在SQL server 2008上。如果
“*”
后面只有数字字符,那么您不会有任何问题,不会。我的解决方案假定您希望行的顺序为
1,2,3,4…10,11,12…20,21等
(数字顺序),而不是
1,10,11,…2,20,21,22,etc
(字符顺序)。如果您想要后一种排序,那么完全不要使用
CONVERT
。case语句具有int数据类型优先级,因此不需要强制转换。case语句具有int数据类型优先级,因此不需要强制转换。