>我需要获取 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;