LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

SQL Server中自定义函数:用指定的分隔符号分割字符串

admin
2024年6月6日 10:16 本文热度 1161

微软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循环后,@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 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved