SQL带条件子串的排序

时间:2018-07-04 15:57:18

标签: 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

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

一些解决方案可以帮助您获得所需的服务:

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函数传递无效的(负)值。

我个人更喜欢使用STUFF,因为REVERSE是相当昂贵的功能。

答案 1 :(得分:1)

您快到了,试试这个

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

enter image description here