按具有条件的子字符串进行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版本太旧了?@ChristophenSiroisTRY\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版本太旧了?@ChristophenSiroisTRY\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数据类型优先级,因此不需要强制转换。