Sql字串分組Split函式的兩種實現方法
在給文章加自定義標籤時,需要在儲存過程中對輸入的字串按照“,”字元分割成一個字元陣列。但是Sql中沒有實現字串分組的Split方法。因此就需要編寫一個自定義的Split函式。我首先是使用表值函式的方法實現的字串分組,但是在使用中感覺不是很方便。後來又在網上找到了一種使用兩個標量函式,其中一個函式首先返回分割後字元陣列的長度,另一個函式依次返回每個分割出的字串。然後使用迴圈依次獲取分割的字元。
表值函式實現Split方法
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', ',')
結果為
id value
----------- ---------------------------------------
1 111
2 b2222
3 323232
4 32d
5 e
6 323232f
7 g3222
(7 行受影響)
使用迴圈的方法
首先GetSplitLength函式返回分割後的字元陣列的長度。
2 (
3 @String nvarchar(max), --要分割的字串
4 @Split nvarchar(10) --分隔符號
5 )
6 returns int
7 as
8 begin
9 declare @location int
10 declare @start int
11 declare @length int
12
13 set @String=ltrim(rtrim(@String))
14 set @location=charindex(@split,@String)
15 set @length=1
16 while @location<>0
17 begin
18 set @start=@location+1
19 set @location=charindex(@split,@String,@start)
20 set @length=@length+1
21 end
22 return @length
23 end
select dbo.GetSplitLength('111,b2222,323232,32d,e,323232f,g3222',',')
結果為7。
GetSplitOfIndex函式是按順序分別獲取分割後的字串。
2 (
3 @String nvarchar(max), --要分割的字串
4 @split nvarchar(10), --分隔符號
5 @index int --取第幾個元素
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)
結果323232。
2 SELECT @Tags='111,b2222,323232,32d,e,323232f,g3222';
3 DECLARE @Tag nvarchar(1000)
4 DECLARE @next int;
5 set @next=1
6
7 DECLARE @Length int;
8 SELECT @Length=dbo.GetSplitLength(@Tags,',')
9
10 while @next<=@Length
11 begin
12 SET @Tag = left(dbo.GetSplitOfIndex(@Tags,',',@next), 16);
13 print @Tag
14 SET @Next=@Next+1;
15 END
結果為:
111
b2222
323232
32d
e
323232f
g3222
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-624191/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 利用SQL的charindex實現字串陣列和Split函式SQLIndex字串陣列函式
- C 語言中返回字串函式的四種實現方法字串函式
- C語言實現字串拷貝函式的幾種方法C語言字串函式
- PHP 每日一函式 — 字串函式 chunk_split ()PHP函式字串
- php中的chunk_split()和str_split()字串函式PHP字串函式
- 三種方法實現strlen函式函式
- ts - 兩種方法實現忽略大小寫的字串排序字串排序
- 轉:類似SQL中的split函式SQL函式
- Perl split字串分割函式用法指南字串函式
- sql 函式實現三種父子遞迴SQL函式遞迴
- SQL實現分組limitSQLMIT
- js中split函式的使用方法JS函式
- 字串相關函式的實現字串函式
- SQL Server COALESCE()函式的2種好用方法SQLServer函式
- Sql字串操作函式SQL字串函式
- SQL SERVER 字串函式SQLServer字串函式
- ton函式函式hash的兩種形式函式
- SQL Server對比兩字串的相似度(函式演算法)SQLServer字串函式演算法
- [MSSQL]實現SQL Server中的切割字串SplitString標量函式SQLServer字串函式
- mysql實戰--MYSQL中的SQL分組方法MySql
- T-SQL——函式——字串操作函式SQL函式字串
- 用listagg函式分組實現列轉行函式
- Python-split()函式用法及簡單實現Python函式
- mysql函式substring_index實現split切割效果MySql函式Index
- PHP內建字串函式實現PHP字串函式
- Sql Server系列:字串函式SQLServer字串函式
- Sql Server函式全解(1):字串函式SQLServer函式字串
- Sql Server函式全解(一)字串函式SQLServer函式字串
- oracle拆分逗號分隔字串 實現splitOracle字串
- [譯] 為函式自定義屬性的八種實現方法函式
- [SQL] rollup & cube 分組函式用法及一例SQL函式
- JavaScript 函式的兩種宣告方式JavaScript函式
- python split()對字串分離Python字串
- 深入理解二分的兩種實現
- 函式組合的 N 種模式函式模式
- c++字串查詢函式實現C++字串函式
- 如何使用OO和函式式兩個方法實現重構? - DZone函式
- mysql與oracle的分組函式MySqlOracle函式