拆分字符串并根据分隔符位置返回值

时间:2015-03-12 19:40:01

标签: sql sql-server

我正在尝试在SQL Server中创建一个函数来拆分输入字符串并根据分隔符的位置返回字符串的一部分..

例如。我有一个字符串

str = kool_2214_live_dbp123

如果我解析文本,分隔符和分隔符的位置。我希望在分隔符之后得到值

所以,我们假设我们有一个接受3个参数的函数

Splitfunction(str, delimiter, occurrence)

如果我通过

Splitfunction(str , _ , 2) 

该函数应返回字符串live

Splitfunction(str , _ , 3) 

应该返回字符串dbp123

提前感谢...

3 个答案:

答案 0 :(得分:1)

首先你需要拆分你的字符串。有很多方法可以做到这一点。我喜欢的一种方式,虽然像Aaron Betrand这样的其他人不喜欢,这是来自Jeff Moden的。 http://www.sqlservercentral.com/articles/Tally+Table/72993/

在这种情况下,这个特别有用。

declare @str varchar(50) = 'kool_2214_live_dbp123'

select *
from dbo.DelimitedSplit8K(@str, '_') s
where s.ItemNumber = 4

另一种选择可能是简单地利用PARSENAME。

select PARSENAME(replace(@str, '_', '.'), 1)

这可能适用于您的实际数据,也可能不适用。如果你有超过4个元素,它将无法达到你想要的效果。如果您的实际数据中有句点,则它也无法按预期工作。

答案 1 :(得分:1)

CREATE FUNCTION [dbo].[Splitfunction]
(
    @queryArg NVARCHAR(MAX),
    @delimiterArg NVARCHAR(MAX),
    @posArg int
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @queryString nvarchar(MAX) = ISNULL(@queryArg,'');
    DECLARE @queryLen int = LEN(@queryString);
    DECLARE @delimiterString nvarchar(MAX) = ISNULL(@delimiterArg,'');
    DECLARE @delimiterLen int = LEN(@delimiterString);
    DECLARE @startPos int = 1;
    DECLARE @endPos int = CHARINDEX(@delimiterString,@queryString);
    DECLARE @queryIndex int = 0;
    -- loop through the string
    WHILE (@startPos<(@queryLen+1)) BEGIN
        -- if the delimiter wasn't found, get all remaining characters
        IF (@endPos=0) SET @endPos=@queryLen+1;
        -- if we're at the index requested return the found string
        IF (@queryIndex=@posArg) RETURN SUBSTRING(@queryString,@startPos,@endPos-@startPos);
        -- advance the start to after the delimiter
        SET @startPos=@endPos+@delimiterLen;
        -- find the next delimiter
        SET @endPos=CHARINDEX(@delimiterString,@queryString,@startPos);
        -- increment the index
        SET @queryIndex += 1;
    END
    RETURN NULL;
END

答案 2 :(得分:0)

您可以使用此功能

而不是破坏字符串

<强>功能

CREATE FUNCTION Split_function_delimiter(@str      VARCHAR(5000),
                                         @POSITION INT)
returns VARCHAR(5000)
AS
  BEGIN
      DECLARE @TEMP   VARCHAR(2),
              @CNTR   INT =1,
              @RESULT VARCHAR(5000),
              @INTR   INT =0,
              @LEN    INT

      SET @LEN =Len(@str)
      WHILE @CNTR <= @LEN
        BEGIN
            SET @TEMP = Substring(@STR, @CNTR, 1)
            IF @TEMP = '_'
              BEGIN
                  SET @INTR += 1
                  IF @INTR = @POSITION
                    BEGIN
                        SET @RESULT = Substring(@STR, @CNTR + 1, CASE
                                                                   WHEN Charindex('_', @STR, @CNTR + 1) - @CNTR < 1 THEN Len(@str)
                                                                   ELSE Charindex('_', @STR, @CNTR + 1) - @CNTR
                                                                 END - 1)

                        BREAK
                    END
              END
            SET @CNTR+=1
        END
      RETURN @RESULT
  END

<强>测试

DECLARE @str VARCHAR(5000) = 'kool_2214_live_dbp123'

SELECT dbo.Split_function_delimiter(@str, 1)--2214
SELECT dbo.Split_function_delimiter(@str, 2)--live
SELECT dbo.Split_function_delimiter(@str, 3)--dbp123