【问题标题】:SQL substring from a string来自字符串的 SQL 子字符串
【发布时间】:2014-08-25 19:37:49
【问题描述】:

我有一个表 XYZ,其中包含 FileName 列,其值如下:

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!它找到最后一个下划线并从那里返回子字符串。如何更改它以便获得第三个下划线并在其后返回一个子字符串!

【问题讨论】:

  • 改为搜索test

标签: sql sql-server substring


【解决方案1】:

charindex 可选地采用起始位置。您可以将多个链接在一起:

select right(FileName, len(FileName) - 
   charindex('_', FileName, 
      charindex('_', FileName, 
         charindex('_', FileName) 
      + 1) 
   + 1))

所以你要求“第一个下划线之后(第一个下划线之后(第一个下划线))” - 即第三个下划线。

【讨论】:

  • 完美运行。谢谢!
【解决方案2】:

这样的事情应该可以工作:

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; 

【讨论】:

  • 感谢您的回复。我发现 Blorgbeard 的解决方案更简单。
  • 这确实假设所有文件名都以“test”开头,但情况可能并非如此。
  • 没错。所有文件名都不以 Test 开头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多