电竞比分网-中国电竞赛事及体育赛事平台

分享

Sql字符串分組Split函數(shù)的兩種實(shí)現(xiàn)方法

 糖糖書屋_CJF 2012-03-24

Sql字符串分組Split函數(shù)的兩種實(shí)現(xiàn)方法

上一篇 / 下一篇 2010-01-04 09:38:34 / 個(gè)人分類:SQL Server技術(shù)

在給文章加自定義標(biāo)簽時(shí),需要在存儲(chǔ)過程中對(duì)輸入的字符串按照“,”字符分割成一個(gè)字符數(shù)組。但是Sql中沒有實(shí)現(xiàn)字符串分組的Split方法。因此就需要編寫一個(gè)自定義的Split函數(shù)。我首先是使用表值函數(shù)的方法實(shí)現(xiàn)的字符串分組,但是在使用中感覺不是很方便。后來又在網(wǎng)上找到了一種使用兩個(gè)標(biāo)量函數(shù),其中一個(gè)函數(shù)首先返回分割后字符數(shù)組的長度,另一個(gè)函數(shù)依次返回每個(gè)分割出的字符串。然后使用循環(huán)依次獲取分割的字符。

表值函數(shù)實(shí)現(xiàn)Split方法

1 Create FUNCTION [dbo].[SplitToTable]
2 (
3
@SplitString nvarchar(max),
4
@Separator nvarchar(10)=' '
5 )
6
RETURNS @SplitStringsTable TABLE
7 (
8
[id] int identity(1,1),
9
[value] nvarchar(max)
10
)
11
AS
12 BEGIN
13 DECLARE @CurrentIndex int;
14
DECLARE @NextIndex int;
15
DECLARE @ReturnText nvarchar(max);
16
SELECT @CurrentIndex=1;
17
WHILE(@CurrentIndex<=len(@SplitString))
18
BEGIN
19 SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex);
20
IF(@NextIndex=0 OR @NextIndex IS NULL)
21
SELECT @NextIndex=len(@SplitString)+1;
22
SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex);
23
INSERT INTO @SplitStringsTable([value]) VALUES(@ReturnText);
24
SELECT @CurrentIndex=@NextIndex+1;
25
END
26 RETURN;
27
END

select * FROm dbo.SplitToTable('111,b2222,323232,32d,e,323232f,g3222', ',')

結(jié)果為

id value
----------- ---------------------------------------
1 111
2 b2222
3 323232
4 32d
5 e
6 323232f
7 g3222

(7 行受影響)

使用循環(huán)的方法

首先GetSplitLength函數(shù)返回分割后的字符數(shù)組的長度。

Create function [dbo].[GetSplitLength]
(
@String nvarchar(max), --要分割的字符串
@Split nvarchar(10) --分隔符號(hào)
)
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',',')

結(jié)果為7。

GetSplitOfIndex函數(shù)是按順序分別獲取分割后的字符串。

1 ALTER function [dbo].[GetSplitOfIndex]
2 (
3
@String nvarchar(max), --要分割的字符串
4 @split nvarchar(10), --分隔符號(hào)
5 @index int --取第幾個(gè)元素
6 )
7
returns nvarchar(1024)
8
as
9 begin
10 declare @location int
11 declare @start int
12 declare @next int
13 declare @seed int
14
15 set @String=ltrim(rtrim(@String))
16
set @start=1
17 set @next=1
18 set @seed=len(@split)
19

20
set @location=charindex(@split,@String)
21
while @location<>0 and @index>@next
22 begin
23 set @start=@location+@seed
24 set @location=charindex(@split,@String,@start)
25
set @next=@next+1
26 end
27 if @location =0 select @location =len(@String)+1
29
30
return substring(@String,@start,@location-@start)
31
end

select dbo.GetSplitOfIndex('111,b2222,323232,32d,e,323232f,g3222',',', 3)

結(jié)果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

結(jié)果為:

111
b2222
323232
32d
e
323232f
g3222

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多