字符串分割大全及实例

1. 分割后按顺序取数据

/* ---------------------------------------------------
fnMain_GetStrSegment (SQL_SCALAR_FUNCTION)
Description: Extracts a specific segment of a string, given the delimiter
Usage remarks / example:
   e.g. Input: 'A•B•C'   Delimiter: '•'
     A = Segment 1
     B = Segment 2
     C = Segment 3
     SELECT dbo.fnMain_GetStrSegment('A•B•C','•',2); --This should return 'B'
---------------------------------------------------*/
BEGIN TRY DROP FUNCTION [dbo].[fnMain_GetStrSegment] END TRY BEGIN CATCH END CATCH
GO
CREATE FUNCTION [dbo].[fnMain_GetStrSegment](@InputStr nvarchar(max), @Delimiter nvarchar(255), @SegmentNo int) RETURNS nvarchar(max) AS
BEGIN
    DECLARE @Result nvarchar(max),@StartPos int,@EndPos int,@Cnt int,@DelimLen tinyint;
    SELECT @Result='',@Cnt=1,@DelimLen=CASE WHEN @Delimiter=N' ' THEN 1 ELSE LEN(@Delimiter) END;
    WHILE @Cnt<=@SegmentNo
    BEGIN
        IF @Cnt=1
        BEGIN SET @StartPos=1 END
        ELSE BEGIN
            SET @StartPos=ISNULL(CHARINDEX(@Delimiter,@InputStr,@StartPos),0)+@DelimLen;
            IF @StartPos<=1 RETURN '';
        END
        SET @EndPos=ISNULL(CHARINDEX(@Delimiter,@InputStr,@StartPos),0);
        IF @EndPos<@StartPos SET @EndPos=LEN(@InputStr)+@DelimLen;
        SET @Cnt=@Cnt+1;
    END
    IF @StartPos>0 AND @EndPos>@StartPos SET @Result=SUBSTRING(@InputStr,@StartPos,@EndPos-@StartPos);
    RETURN @Result;
END
GO

 

-------For Example     --SELECT dbo.fnMain_GetStrSegment('1|4|5',N'|',2)

 

2.  分割成整形表

/* ---------------------------------------------------
tfMain_StrToTblInt (SQL_TABLE_VALUED_FUNCTION)
Description: Function to convert a string into a table of integers by splitting with a given delimiter
Usage remarks / example:
---------------------------------------------------*/
BEGIN TRY DROP FUNCTION [dbo].[tfMain_StrToTblInt] END TRY BEGIN CATCH END CATCH
GO
CREATE FUNCTION [dbo].[tfMain_StrToTblInt](@InputStr nvarchar(MAX), @Delimiter nchar(1)) RETURNS @OutputTable TABLE ( Val int ) AS
BEGIN
    DECLARE @TmpVal nvarchar(max);
    WHILE LEN(@InputStr) > 0
    BEGIN
        SET @TmpVal = LTRIM(RTRIM(LEFT(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr) - 1, -1), LEN(@InputStr)))));
        SET @InputStr = SUBSTRING(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr), 0), LEN(@InputStr)) + 1, LEN(@InputStr));
        IF LEN(@TmpVal)>0 AND ISNUMERIC(@TmpVal)<>0
        BEGIN
            INSERT INTO @OutputTable ( Val ) VALUES ( CONVERT(int,@TmpVal) );
        END
    END
    RETURN;
END
GO
BEGIN TRY DROP FUNCTION [dbo].[tfMain_StrToTblInt_Ordered] END TRY BEGIN CATCH END CATCH
GO
CREATE FUNCTION [dbo].[tfMain_StrToTblInt_Ordered](@InputStr nvarchar(MAX), @Delimiter nchar(1)) RETURNS @OutputTable TABLE ( RowNo int PRIMARY KEY, Val int ) AS
BEGIN
    DECLARE @TmpVal nvarchar(max), @RowNo int; SET @RowNo=1;
    WHILE LEN(@InputStr) > 0
    BEGIN
        SET @TmpVal = LTRIM(RTRIM(LEFT(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr) - 1, -1), LEN(@InputStr)))));
        SET @InputStr = SUBSTRING(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr), 0), LEN(@InputStr)) + 1, LEN(@InputStr));
        IF LEN(@TmpVal)>0 AND ISNUMERIC(@TmpVal)<>0
        BEGIN
            INSERT INTO @OutputTable ( RowNo, Val ) VALUES ( @RowNo, CONVERT(int,@TmpVal) );
            IF @@ROWCOUNT>0 SET @RowNo=@RowNo+1;
        END
    END
    RETURN;
END
GO

-------For Example     --select val from dbo.[tfMain_StrToTblInt_Ordered]('7•4•5','•')

 

2.  分割成字符表

 

/* ---------------------------------------------------
tfMain_StrToTblStr (SQL_TABLE_VALUED_FUNCTION)
Description: Function to convert a string into a table of strings by splitting with a given delimiter
Usage remarks / example:
---------------------------------------------------*/
BEGIN TRY DROP FUNCTION [dbo].[tfMain_StrToTblStr] END TRY BEGIN CATCH END CATCH
GO
CREATE FUNCTION [dbo].[tfMain_StrToTblStr](@InputStr nvarchar(MAX), @Delimiter nchar(1)) RETURNS @OutputTable TABLE ( Val nvarchar(MAX) ) AS
BEGIN
    DECLARE @TmpVal nvarchar(max);
    WHILE LEN(@InputStr) > 0
    BEGIN
        SET @TmpVal = LEFT(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr) - 1, -1), LEN(@InputStr)));
        SET @InputStr = SUBSTRING(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr), 0), LEN(@InputStr)) + 1, LEN(@InputStr));
        INSERT INTO @OutputTable ( Val ) VALUES ( @TmpVal );
    END
    RETURN;
END
GO
BEGIN TRY DROP FUNCTION [dbo].[tfMain_StrToTblStr_Ordered] END TRY BEGIN CATCH END CATCH
GO
CREATE FUNCTION [dbo].[tfMain_StrToTblStr_Ordered](@InputStr nvarchar(MAX), @Delimiter nchar(1)) RETURNS @OutputTable TABLE ( RowNo int PRIMARY KEY, Val nvarchar(MAX) ) AS
BEGIN
    DECLARE @TmpVal nvarchar(max), @RowNo int; SET @RowNo=1;
    WHILE LEN(@InputStr) > 0
    BEGIN
        SET @TmpVal = LEFT(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr) - 1, -1), LEN(@InputStr)));
        SET @InputStr = SUBSTRING(@InputStr, ISNULL(NULLIF(CHARINDEX(@Delimiter, @InputStr), 0), LEN(@InputStr)) + 1, LEN(@InputStr));
        INSERT INTO @OutputTable ( RowNo, Val ) VALUES ( @RowNo, @TmpVal );
        IF @@ROWCOUNT>0 SET @RowNo=@RowNo+1;
    END
    RETURN;
END
GO

 

-------For Example     --select val from dbo.tfMain_StrToTblStr('1•4•5','•')

 

posted @ 2019-08-30 14:28  牧夫座  阅读(136)  评论(0编辑  收藏  举报