我正在尝试在SQL Server中创建一个函数来拆分输入字符串并根据分隔符的位置返回字符串的一部分..
例如。我有一个字符串
str = kool_2214_live_dbp123
如果我解析文本,分隔符和分隔符的位置。我希望在分隔符之后得到值
所以,我们假设我们有一个接受3个参数的函数
Splitfunction(str, delimiter, occurrence)
如果我通过
Splitfunction(str , _ , 2)
该函数应返回字符串live
Splitfunction(str , _ , 3)
应该返回字符串dbp123
提前感谢...
答案 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