SQL 按带条件的子串排序
SQL Ordering by a substring with a condition
我有这样的数据:
[Model Number]
[Model Number]*1
[Model Number]*4
[Model Number]*10
[Model Number]*13
当我 select 他们时,我会按“*”后的数字对他们进行排序,我几乎可以正常工作,但我不知道如何处理我没有“”的情况*”。这是我查询的最后一部分:
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
将 return 0
。然后你最终不会将无效(负)值传递给 RIGHT
函数,如 NULL - 1 = NULL
.
我个人的偏好是使用 STUFF
,因为 REVERSE
是一个相当昂贵的函数。
你快到了,试试这个
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
我有这样的数据:
[Model Number]
[Model Number]*1
[Model Number]*4
[Model Number]*10
[Model Number]*13
当我 select 他们时,我会按“*”后的数字对他们进行排序,我几乎可以正常工作,但我不知道如何处理我没有“”的情况*”。这是我查询的最后一部分:
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
将 return 0
。然后你最终不会将无效(负)值传递给 RIGHT
函数,如 NULL - 1 = NULL
.
我个人的偏好是使用 STUFF
,因为 REVERSE
是一个相当昂贵的函数。
你快到了,试试这个
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