Sql字符串分组Split函数的两种实现方法
在給文章加自定義標簽時,需要在存儲過程中對輸入的字符串按照“,”字符分割成一個字符數組。但是Sql中沒有實現字符串分組的Split方法。因此就需要編寫一個自定義的Split函數。我首先是使用表值函數的方法實現的字符串分組,但是在使用中感覺不是很方便。后來又在網上找到了一種使用兩個標量函數,其中一個函數首先返回分割后字符數組的長度,另一個函數依次返回每個分割出的字符串。然后使用循環依次獲取分割的字符。
表值函數實現Split方法
代碼 ?Create?FUNCTION?[dbo].[SplitToTable]?(
?????@SplitString?nvarchar(max),
?????@Separator?nvarchar(10)='?'
?)
?RETURNS?@SplitStringsTable?TABLE
?(
?[id]?int?identity(1,1),
?[value]?nvarchar(max)
?)
?AS
?BEGIN
?????DECLARE?@CurrentIndex?int;
?????DECLARE?@NextIndex?int;
?????DECLARE?@ReturnText?nvarchar(max);
?????SELECT?@CurrentIndex=1;
?????WHILE(@CurrentIndex<=len(@SplitString))
?????????BEGIN
?????????????SELECT?@NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
?????????????IF(@NextIndex=0?OR?@NextIndex?IS?NULL)
?????????????????SELECT?@NextIndex=len(@SplitString)+1;
?????????????????SELECT?@ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);
?????????????????INSERT?INTO?@SplitStringsTable([value])?VALUES(@ReturnText);
?????????????????SELECT?@CurrentIndex=@NextIndex+1;
?????????????END
?????RETURN;
?END
?
select * FROm dbo.SplitToTable('111,b2222,323232,32d,e,323232f,g3222', ',')
結果為
id????????? value
----------- ---------------------------------------
1?????????? 111
2?????????? b2222
3?????????? 323232
4?????????? 32d
5?????????? e
6?????????? 323232f
7?????????? g3222
(7 行受影響)
?
使用循環的方法
首先GetSplitLength函數返回分割后的字符數組的長度。
?
代碼 ?Create?function?[dbo].[GetSplitLength]?(
??@String?nvarchar(max),??--要分割的字符串
??@Split?nvarchar(10)??--分隔符號
?)
?returns?int
?as
?begin
??declare?@location?int
??declare?@start?int
??declare?@length?int
?
??set?@String=ltrim(rtrim(@String))
??set?@location=charindex(@split,@String)
??set?@length=1
??while?@location<>0
??begin
????set?@start=@location+1
????set?@location=charindex(@split,@String,@start)
????set?@length=@length+1
??end
??return?@length
?end
?
?
select dbo.GetSplitLength('111,b2222,323232,32d,e,323232f,g3222',',')
結果為7。
?
GetSplitOfIndex函數是按順序分別獲取分割后的字符串。
?
代碼 ?ALTER?function?[dbo].[GetSplitOfIndex]?(
??@String?nvarchar(max),??--要分割的字符串
??@split?nvarchar(10),??--分隔符號
??@index?int?--取第幾個元素
?)
?returns?nvarchar(1024)
?as
?begin
??declare?@location?int
??declare?@start?int
??declare?@next?int
??declare?@seed?int
?
??set?@String=ltrim(rtrim(@String))
??set?@start=1
??set?@next=1
??set?@seed=len(@split)
??
??set?@location=charindex(@split,@String)
??while?@location<>0?and?@index>@next
??begin
????set?@start=@location+@seed
????set?@location=charindex(@split,@String,@start)
????set?@next=@next+1
??end
??if?@location?=0?select?@location?=len(@String)+1?
??
??return?substring(@String,@start,@location-@start)
?end
?
?
select dbo.GetSplitOfIndex('111,b2222,323232,32d,e,323232f,g3222',',', 3)結果323232。
?
?
代碼 ?DECLARE?@Tags?nvarchar(max);?SELECT?@Tags='111,b2222,323232,32d,e,323232f,g3222';
?DECLARE?@Tag?nvarchar(1000)
?DECLARE?@next?int;
?set?@next=1
?
?DECLARE?@Length?int;
?SELECT?@Length=dbo.GetSplitLength(@Tags,',')
?while?@next<=@Length
?begin
?????SET?@Tag?=?left(dbo.GetSplitOfIndex(@Tags,',',@next),?16);
?????print?@Tag
?????SET?@Next=@Next+1;
?END
?
?
結果為:
111
b2222
323232
32d
e
323232f
g3222
總結
以上是生活随笔為你收集整理的Sql字符串分组Split函数的两种实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 芒果网笔试面试经历
- 下一篇: AWARD BIOS设置(INTEL芯片