微軟SQL Server數據庫中包含了很多內置的函數,入下圖:
它們用于處理日期、數學、元數據、字符串等。
其中最為常用的就是處理字符串,里面包含了CharIndex()等函數,非常方便使用。
但是對于 特殊字符串的處理,比如:ISBN號 '978-7-5007-7234-7',如果想獲取第三個與第四個分割符號之間的數字,
那么SQL 內置函數無法直接做到。這時就需要自定義函數。下面自定義三個函數,用于處理特殊的字符串。
一、按指定符號分割字符串,返回分割后的元素個數
1 ALTER FUNCTION [dbo].[Fun_GetStrArrayLength]
2 (
3 @originalStr VARCHAR(1024), --要分割的字符串
4 @split VARCHAR(10) --分隔符號
5 )
6 RETURNS INT
7 AS
8 BEGIN
9 DECLARE @location INT; --定義起始位置
10 DECLARE @start INT; --定義從第幾個開始
11 DECLARE @length INT; --定義變量,用于接收計算元素的個數
12
13 SET @originalStr = LTRIM(RTRIM(@originalStr)); --去除字符串左右兩側的空格
14
15 SET @location = CHARINDEX(@split, @originalStr); --分割符號在字符串中第一次出現的位置(索引從1開始計數)
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
調用函數:select dbo.Fun_GetStrArrayLength('978-7-5007-7234-7','-')
結果:5
二、按指定符號分割字符串,返回分割后指定索引的第幾個元素,像數組一樣方便
1 ALTER FUNCTION [dbo].[Fun_GetStrArrayStrOfIndex]
2 (
3 @originalStr VARCHAR(1024), --要分割的字符串
4 @split VARCHAR(10), --分隔符號
5 @index INT --取第幾個元素
6 )
7 RETURNS VARCHAR(1024)
8 AS
9 BEGIN
10 DECLARE @location INT; --定義第一次出現分隔符號的位置
11 DECLARE @start INT; --定義開始位置
12 DECLARE @next INT; --定義下一個位置
13 DECLARE @seed INT; --定義分割符號的長度
14
15 SET @originalStr = LTRIM(RTRIM(@originalStr)); --去除字符串左右2側空格
16 SET @start = 1;
17 SET @next = 1;
18 SET @seed = LEN(@split);
19
20 SET @location = CHARINDEX(@split, @originalStr); --第一次出現分隔符號的位置
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、字符串不存在分隔符號。
37 --2、字符串中存在分隔符號,跳出while循環(huán)后,@location為0,那默認為字符串后邊有一個分隔符號。
38
39 RETURN SUBSTRING(@originalStr, @start, @location -@start);
40 END
調用函數:select dbo.Fun_GetStrArrayStrOfIndex('978-7-5007-7234-7','-',4)
結果:7234
三、像數組一樣遍歷字符串中的元素
1 ALTER FUNCTION [dbo].[Fun_SplitStr]
2 (
3 @originalStr VARCHAR(8000), --要分割的字符串
4 @split varchar(100) --分隔符號
5 )
6 RETURNS @temp TABLE(Result VARCHAR(100))
7 AS
8 BEGIN
9 DECLARE @result AS VARCHAR(100); --定義變量用于接收單個結果
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()函數用于刪除指定長度的字符,并可以在指定的起點處插入另一組字符。
20 SET @originalStr = STUFF(@originalStr, 1, CHARINDEX(@split, @originalStr, 1), '');
21 END
22 RETURN
23 END
調用示例:select * from dbo.Fun_SplitStr('978-7-5007-7234-7','-')
結果: 978
7
5007
7234
7