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