Оптимизация запроса подстроки с помощью charindex для обрезки левой части строки - PullRequest
0 голосов
/ 27 августа 2018

Мне нужно получить подстроку xyzdf / 1234, в результате чего получится 1234 (т.е. обрезка левой части косой черты /). Я использовал

substring('xyzdf/1234',charindex('/','xyzdf/1234')+1,len('xyzdf/1234')-charindex('/','xyzdf/1234')) 

, который работает, но повторяется ...

тогда я использовал этот способ:

stuff('xyzdf/1234',1,charindex('/','xyzdf/1234'),'') и это тоже работает, и это более компактно, но все же повторяет один и тот же аргумент дважды 'xyzdf / 1234'.

Интересно, что было бы быстрее обрезать левую часть? Мне нужно будет очистить данные в одном столбце для миллионов записей. Не уверен, что команда stuff достаточно быстрая. (Имейте в виду, это массовая операция). Спасибо!

1 Ответ

0 голосов
/ 27 августа 2018

Вы можете выбрать строку из ЗНАЧЕНИЙ.
Таким образом, вы можете повторить значение без двойного его жесткого кодирования.
Тогда получите правильную часть с номером от этого.

F.e. используя RIGHT, CHARINDEX, REVERSE и VALUES:

select right(val, charindex('/',reverse(val))-1) as nr
from (values ('xyzdf/1234')) q(val);

Или используйте SUBSTRING, CHARINDEX, LEN и VALUES:

select substring(val,charindex('/',val)+1,len(val)) as nr
from (values ('xyzdf/1234')) q(val);

Или злоупотреблять PARSENAME :

select parsename(replace('xyzdf/1234','/','.'),1) as nr;

Или использовать переменные:

declare @value varchar(30) = 'xyzdf/1234';
declare @nr int = right(@value, charindex('/',reverse(@value))-1);
select @nr as nr;

Но если намерение состоит в том, чтобы обновить столбец, чтобы оставалось только число? Тогда использование метода SUBSTRING, вероятно, остается самым безопасным.
Потому что он оставит тех без / нетронутыми и без сбоев при ошибке Invalid length parameter passed.

Пример:

declare @Table table (id int identity(1,1) primary key, col1 varchar(30));

insert into @Table (col1) values 
('xyzdf/1234'),
('12345');

update @Table 
set col1 = substring(col1,charindex('/',col1)+1,len(col1))
where col1 like '%/[0-9]%';

select * from @Table;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...