字符串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