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



>我需要获取 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命令是否足够快。(请注意,这是一个批量操作(。谢谢!

您可以从 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);

或滥用解析名称:

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;

最新更新