如何在TSQL中的第三和第四个特殊字符之间提取字符串


字符串1:1*2*3*4*5*6*字符串2:1*2*3*40*500*6*字符串3:1*2*3*400*5*600*字符串4:1*2*3*4000*50*6000*目标是返回以下字符串:字符串1:4字符串2:40字符串3:400字符串4:4000 

几乎任何解析/拆分功能都可以做到。这种在线方法不需要UDF,也需要返回项目序列。

示例

Declare @YourTable table (ID int,SomeCol varchar(500))
Insert Into @YourTable values
(1,'1*2*3*4*5*6*'),
(2,'1*2*3*40*500*6*'),
(3,'1*2*3*400*5*600*'),  
(4,'1*2*3*4000*50*6000*')
Select A.ID
      ,B.RetVal
 From  @YourTable A
 Cross Apply (
                Select RetSeq = Row_Number() over (Order By (Select null))
                      ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                From  (Select x = Cast('<x>' + replace((Select replace(A.SomeCol,'*','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                Cross Apply x.nodes('x') AS B(i)
             ) B
 Where RetSeq=4

返回

ID  RetVal
1   4
2   40
3   400
4   4000

在SQL Server 2016 中您可以使用string_split()

在2016年以前的SQL Server中,使用Jeff Moden的CSV分离器表Rewure功能:

select 
    str
  , s.ItemNumber
  , s.Item
from t
  cross apply dbo.DelimitedSplit8k(t.str,'*') s
where s.ItemNumber = 4

rextester演示:http://rextester.com/hycf1752

返回:

+---------------------+------------+------+
|         str         | ItemNumber | Item |
+---------------------+------------+------+
| 1*2*3*4*5*6*        |          4 |    4 |
| 1*2*3*40*500*6*     |          4 |   40 |
| 1*2*3*400*5*600*    |          4 |  400 |
| 1*2*3*4000*50*6000* |          4 | 4000 |
+---------------------+------------+------+

拆分字符串参考:

  • Tally哦!改进的SQL 8K" CSV分离器"功能-Jeff Moden
  • 分裂字符串:后续 - 亚伦·伯特兰(Aaron Bertrand(
  • 以正确的方式分开字符串 - 或下一个最好的方法 - 亚伦·伯特兰(Aaron Bertrand(
  • string_split() 在SQL Server 2016:后续#1 -Aaron Bertrand

相关内容

  • 没有找到相关文章

最新更新