微軟SQL Server數(shù)據(jù)庫(kù)中包含了很多內(nèi)置的函數(shù),入下圖:
它們用于處理日期、數(shù)學(xué)、元數(shù)據(jù)、字符串等。
其中最為常用的就是處理字符串,里面包含了CharIndex()等函數(shù),非常方便使用。
但是對(duì)于 特殊字符串的處理,比如:ISBN號(hào) '978-7-5007-7234-7',如果想獲取第三個(gè)與第四個(gè)分割符號(hào)之間的數(shù)字,
那么SQL 內(nèi)置函數(shù)無(wú)法直接做到。這時(shí)就需要自定義函數(shù)。下面自定義三個(gè)函數(shù),用于處理特殊的字符串。
一、按指定符號(hào)分割字符串,返回分割后的元素個(gè)數(shù)
代碼語(yǔ)言:javascript
代碼運(yùn)行次數(shù):0
1 ALTER FUNCTION [dbo].[Fun_GetStrArrayLength]
2 (
3 @originalStr VARCHAR(1024), --要分割的字符串
4 @split VARCHAR(10) --分隔符號(hào)
5 )
6 RETURNS INT
7 AS
8 BEGIN
9 DECLARE @location INT; --定義起始位置
10 DECLARE @start INT; --定義從第幾個(gè)開(kāi)始
11 DECLARE @length INT; --定義變量,用于接收計(jì)算元素的個(gè)數(shù)
12
13 SET @originalStr = LTRIM(RTRIM(@originalStr)); --去除字符串左右兩側(cè)的空格
14
15 SET @location = CHARINDEX(@split, @originalStr); --分割符號(hào)在字符串中第一次出現(xiàn)的位置(索引從1開(kāi)始計(jì)數(shù))
16
17 SET @length = 1;
18
19 WHILE @location <> 0
20 BEGIN
21 SET @start = @location + 1;
22 SET @location = CHARINDEX(@split, @originalStr, @start);
23 SET @length = @length + 1;
24 END
25 RETURN @length;
26 END
調(diào)用函數(shù):select dbo.Fun_GetStrArrayLength('978-7-5007-7234-7','-')
結(jié)果:5
二、按指定符號(hào)分割字符串,返回分割后指定索引的第幾個(gè)元素,像數(shù)組一樣方便
代碼語(yǔ)言:javascript
代碼運(yùn)行次數(shù):0
1 ALTER FUNCTION [dbo].[Fun_GetStrArrayStrOfIndex]
2 (
3 @originalStr VARCHAR(1024), --要分割的字符串
4 @split VARCHAR(10), --分隔符號(hào)
5 @index INT --取第幾個(gè)元素
6 )
7 RETURNS VARCHAR(1024)
8 AS
9 BEGIN
10 DECLARE @location INT; --定義第一次出現(xiàn)分隔符號(hào)的位置
11 DECLARE @start INT; --定義開(kāi)始位置
12 DECLARE @next INT; --定義下一個(gè)位置
13 DECLARE @seed INT; --定義分割符號(hào)的長(zhǎng)度
14
15 SET @originalStr = LTRIM(RTRIM(@originalStr)); --去除字符串左右2側(cè)空格
16 SET @start = 1;
17 SET @next = 1;
18 SET @seed = LEN(@split);
19
20 SET @location = CHARINDEX(@split, @originalStr); --第一次出現(xiàn)分隔符號(hào)的位置
21
22 WHILE @location <> 0
23 AND @index > @next
24 BEGIN
25 SET @start = @location + @seed;
26 SET @location = CHARINDEX(@split, @originalStr, @start);
27 SET @next = @next + 1;
28 END
29
30 IF @location = 0
31 BEGIN
32 SELECT @location = LEN(@originalStr) + 1;
33 END
34
35 --存在兩種情況:
36 --1、字符串不存在分隔符號(hào)。
37 --2、字符串中存在分隔符號(hào),跳出while循環(huán)后,@location為0,那默認(rèn)為字符串后邊有一個(gè)分隔符號(hào)。
38
39 RETURN SUBSTRING(@originalStr, @start, @location -@start);
40 END
調(diào)用函數(shù):select dbo.Fun_GetStrArrayStrOfIndex('978-7-5007-7234-7','-',4)
結(jié)果:7234
三、像數(shù)組一樣遍歷字符串中的元素
代碼語(yǔ)言:javascript
代碼運(yùn)行次數(shù):0
1 ALTER FUNCTION [dbo].[Fun_SplitStr]
2 (
3 @originalStr VARCHAR(8000), --要分割的字符串
4 @split varchar(100) --分隔符號(hào)
5 )
6 RETURNS @temp TABLE(Result VARCHAR(100))
7 AS
8 BEGIN
9 DECLARE @result AS VARCHAR(100); --定義變量用于接收單個(gè)結(jié)果
10
11 SET @originalStr = @originalStr + @split ;
12
13 WHILE (@originalStr <> '')
14 BEGIN
15 SET @result = LEFT(@originalStr, CHARINDEX(@split, @originalStr, 1) -1) ;
16
17 INSERT @temp VALUES(@result) ;
18
19 --STUFF()函數(shù)用于刪除指定長(zhǎng)度的字符,并可以在指定的起點(diǎn)處插入另一組字符。
20 SET @originalStr = STUFF(@originalStr, 1, CHARINDEX(@split, @originalStr, 1), '');
21 END
22 RETURN
23 END
調(diào)用示例:select * from dbo.Fun_SplitStr('978-7-5007-7234-7','-')
結(jié)果: 978
7
5007
7234
7