使用charindex优化子字符串查询以修剪字符串的左侧部分

时间:2018-08-27 10:38:03

标签: sql sql-server tsql

我需要获取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 :(得分:2)

您可以从VALUES中选择字符串。
这样,您就可以重复该值,而无需对其进行两次硬编码。
然后从中获取正确的部分及其编号。

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;