首页 > 解决方案 > sql将字符串拆分为始终相同数量的片段

问题描述

我需要使用分隔符将字符串分成几部分(例如,)

在任何情况下,我都需要相同的块数,如果文本太短,函数应该返回空字符串。

我想将其存储为标量函数,因为与表值函数相比,在需要的地方使用它更好。

我正在寻找像 myFunction (inputstring, chunknumber) 这样的函数

例如:输入字符串 = abc, def, ghi

预期的样本结果:

myFunction (inputstring, 1) --> 'abc'

myFunction (inputstring, 3) --> 'ghi'

myFunction (inputstring, 5) --> ''

标签: sqlsql-serverfunctionuser-defined-functions

解决方案


在 SQL Server 中,您可以使用以下用户定义函数:

CREATE FUNCTION [dbo].[myFunction]
(   
    @String         VARCHAR(MAX), 
    @ChunkNumber    INT
)
RETURNS VARCHAR (100)  
AS
BEGIN     
    DECLARE @Incrementer AS INT = 1;   
    DECLARE @SliceValue VARCHAR(MAX);
    DECLARE @Delimiter AS CHAR(1) = ',';
    DECLARE @ReturnObject AS VARCHAR (100) = '';
    DECLARE @SplitedValues TABLE (Id INT IDENTITY NOT NULL, Item VARCHAR (100));

    IF LEN(@String) < 1 OR @String IS NULL  
        RETURN @ReturnObject   

    WHILE @Incrementer != 0     
    BEGIN     
        SET @Incrementer = CHARINDEX(@Delimiter, @String);

        IF @Incrementer != 0     
            SET @SliceValue = LEFT(@String, @Incrementer - 1)     
        ELSE     
            SET @SliceValue = @String     

        IF(LEN(@SliceValue) > 0)
            INSERT INTO @SplitedValues(Item) VALUES (@SliceValue)     

        SET @String = RIGHT(@String, LEN(@String) - @Incrementer)     
        IF LEN(@String) = 0 BREAK     
    END 

    SELECT @ReturnObject = Item FROM @SplitedValues WHERE Id = @ChunkNumber;

RETURN @ReturnObject  

END

示例执行:

SELECT [dbo].[myFunction] ('abc, def, ghi', 5) -- returns empty
SELECT [dbo].[myFunction] ('abc, def, ghi', 3) -- returns ghi
SELECT [dbo].[myFunction] ('abc, def, ghi', 1) -- returns abc

推荐阅读