SQL Server中自定義函數:用指定的分隔符號分割字符串


微軟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循環后,@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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM