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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- php中的chunk_split()和str_split()字串函式PHP字串函式
- PHP 每日一函式 — 字串函式 chunk_split ()PHP函式字串
- 三種方法實現strlen函式函式
- Perl split字串分割函式用法指南字串函式
- ts - 兩種方法實現忽略大小寫的字串排序字串排序
- 字串相關函式的實現字串函式
- T-SQL——函式——字串操作函式SQL函式字串
- mysql函式substring_index實現split切割效果MySql函式Index
- Python-split()函式用法及簡單實現Python函式
- 用listagg函式分組實現列轉行函式
- ton函式函式hash的兩種形式函式
- python split()對字串分離Python字串
- PHP內建字串函式實現PHP字串函式
- 如何使用OO和函式式兩個方法實現重構? - DZone函式
- python中7種方法實現字串的拼接Python字串
- SQL中常用的字串LEFT函式和RIGHT函式詳解!SQL字串函式
- [譯] 為函式自定義屬性的八種實現方法函式
- split() 函式解析 (一)函式
- c++字串查詢函式實現C++字串函式
- 【C語言】常用的字串函式及相關函式的自我實現C語言字串函式
- Python中的split()函式的用法Python函式
- SQL中的常用的字串處理函式大全SQL字串函式
- 深入理解二分的兩種實現
- 函式組合的 N 種模式函式模式
- 模擬實現字串函式strlen , strcpy ,strcmp字串函式
- C語言-字串函式的實現(五)之strstrC語言字串函式
- C語言-字串函式的實現(一)之strlenC語言字串函式
- Spring宣告式事務的兩種實現方式Spring
- 兩種方法使vue實現jQuery呼叫VuejQuery
- RabbitMQ實現延時訊息的兩種方法MQ
- 6、Oracle中的分組函式Oracle函式
- 「分散式技術專題」兩種向量化執行引擎的實現方法分散式
- 一種將函式模板定義和宣告分開的方法函式
- 三種方法實現算出字串中出現多字元字串字元
- 呼叫函式實現兩個數交換函式
- Go 函式的三種用法:方法、閉包、實參Go函式
- mysql 效果類似split函式MySql函式
- sql常用函式詳解(一)——字串擷取SQL函式字串
- T-SQL——自定義函式解析JSON字串SQL函式JSON字串