我有一个带有FileName列的XYZ表,其值如下:
CCA_Type-PROPOSAL_Id-45845_Test1.txt
CPA_Type-PROPOSAL_Id-490845_Test2.txt
我想更新此列,使其仅包含文件名并删除其他字符:
Test1.txt
Test2.txt
因此我写了以下内容:
Update XYZ
set FileName = (select RIGHT(FileName,CHARINDEX('_',REVERSE(FileName),0)-1))
但是如果FileName的值如下:
CCA_Type-PROPOSAL_Id-45845_Test_RR1.txt
我的脚本返回RR1.txt而不是Test_RR1.txt!它找到最后一个下划线并从那里返回子串。如何更改它以便获得第3个下划线并返回其后的子字符串!
答案 0 :(得分:3)
charindex
可选择占用一个起始位置。你可以把几个连在一起:
select right(FileName, len(FileName) -
charindex('_', FileName,
charindex('_', FileName,
charindex('_', FileName)
+ 1)
+ 1))
所以你要求“后面的第一个下划线(第一个下划线之后的第一个下划线)” - 即第三个下划线。
答案 1 :(得分:1)
这样的事情应该有效:
declare @table table (
[file_name] [sysname]
);
declare @pattern [sysname]= N'_test';
insert into @table
([file_name])
values (N'CCA_Type-PROPOSAL_Id-45845_Test1.txt'),
(N'CPA_Type-PROPOSAL_Id-490845_Test2.txt'),
(N'CCA_Type-PROPOSAL_Id-45845_Test_RR1.txt');
select [file_name] as [file_name]
, charindex(@pattern, lower([file_name])) as [character_index_of_pattern]
, substring([file_name], charindex(@pattern, lower([file_name])), len([file_name])) as [desired_output]
from @table;