我需要获取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
命令是否足够快。 (请记住,这是批量操作)。谢谢!
答案 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;