比如下面一串字符,把连续的数字使用“-”连接起来。

DECLARE @Source NVARCHAR(MAX) = N'1,2,3,5,6,7,9,10,33,34,35,36,37,100,101,102,103,104,111,142,137,188,189,200,205,206'


结果要求如下:

连续数字使用连接符替换

 

解决问题,Insus.NET创建2个自定义函数:

连续数字使用连接符替换

 

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:     Insus.NET
-- Create date: 2019-05-27
-- Update date: 2019-05-27
-- Description: 分割字符串
-- =============================================

CREATE FUNCTION [dbo].[tvf_SplitStringAsTwoField]
(
    @Source NVARCHAR(MAX)
)
RETURNS @returnResult TABLE
(
    [From] INT NOT NULL,
    [To] INT NOT NULL
)
AS
BEGIN   
    SET @Source = @Source + N',';

    IF CHARINDEX(',',@Source) > 0
    BEGIN
        WHILE CHARINDEX(',', @Source) > 0
        BEGIN
            DECLARE @CutoutString NVARCHAR(MAX) = SUBSTRING(@Source, 0, CHARINDEX(',', @Source))
            SET @Source = LTRIM(RTRIM(SUBSTRING(@Source, CHARINDEX(',', @Source) + 1, LEN(@Source))))

            DECLARE @from INT,@to INT
            SELECT TOP 1 @from = [From], @to = ([To]) FROM @returnResult ORDER BY [From] DESC
 
            IF @from IS NULL AND @to IS NULL        
                INSERT INTO @returnResult ([From],[To]) VALUES(@CutoutString,@CutoutString)        
            ELSE
            BEGIN
                IF @to + 1 = CAST(@CutoutString AS INT)           
                    UPDATE @returnResult SET [To] = @CutoutString WHERE [From] = @from            
                ELSE
                    INSERT INTO @returnResult ([From],[To]) VALUES(@CutoutString,@CutoutString)
            END    
        END
    END
    ELSE
        INSERT INTO @returnResult ([From],[To]) VALUES(@Source,@Source)
    RETURN
END
GO
Source Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-07-04
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-27
  • 2022-12-23
猜你喜欢
  • 2022-02-20
  • 2021-06-25
  • 2021-06-22
  • 2021-10-03
  • 2022-01-07
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案