Упорядочивание SQL по подстроке с условием - PullRequest
0 голосов
/ 04 июля 2018

У меня есть данные, которые выглядят так:

[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 голосов
/ 04 июля 2018

Вы почти там, попробуйте это

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

0 голосов
/ 04 июля 2018

Пара решений, которые должны дать вам то, что вы ищете:

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 довольно дорогая функция.

...