如何解决提取字符串的SQL函数
| 从上一个问题开始,此SQL函数将在设置的字符串之后提取字符串。 所以,extractAfter(\"hello this is a Test:12356.jpg reset of line\",\"Test:\")
返回:12356.jpg
它可以工作,但是我需要对其进行调整以考虑其他两件事:
除空格外,字符串应在遇到\“ <\”时结束
如果没有匹配项,我想返回null
所以,
extractAfter(\"hello this is a Test:12356.jpg<br> reset of line\",\"Test:\")
还会返回:12356.jpg
create function dbo.extractAfter(@full nvarchar(max),@part nvarchar(max))
returns nvarchar(max) with returns null on null input as
begin
return ltrim(stuff(left(@full,charindex(\' \',@full + \' \',charindex(@part,@full)+1)),1,@full)+datalength(@part)/2 -1,\'\'))
end
go
解决方法
CREATE FUNCTION dbo.extractAfter (@full nvarchar(max),@part nvarchar(max))
RETURNS nvarchar(max)
WITH RETURNS NULL ON NULL INPUT
AS BEGIN
RETURN (
SELECT LEFT(p,PATINDEX(\'%[ <]%\',p + \' \') - 1)
FROM (SELECT
p = STUFF(@full,1,NULLIF(CHARINDEX(@part,@full),0) + LEN(@part) - 1,\'\')
) s
)
END
,如果您使用的是SQL Server 2005或更高版本,我建议您使用正则表达式,而不是尝试在T-SQL确实不擅长于文本分析时继续调整字符串分析功能。您可以在Internet上找到许多针对这些示例的确切SQLCLR代码的示例,也可以下载免费版本的SQL#库(由我编写)并立即开始使用它们。以下是一些使用您的特定情况的示例:
SELECT SQL#.RegEx_CaptureGroup(\'hello this is a Test:12356.jpg<br> reset of line\',\'Test:([^ ]+)<br>\',NULL,-1,\'\')
-- 12356.jpg
SELECT SQL#.RegEx_CaptureGroup(\'hello this is a Test:<br> reset of line\',\'\')
-- NULL
SELECT SQL#.RegEx_CaptureGroup(\'hello this is a T:12356.jpg<br> reset of line\',\'\')
-- NULL
在每种情况下,模式匹配都以单词“ Test:”开始,然后捕获所有非空格字符,直到到达\“ \”(或空格,因为它正在寻找非空格)。如果由于\“ Test:\”和\“
\”之间什么都不存在而找不到,或者如果\“ Test:\”开头不存在,则返回
NULL
。
,Declare @TestString varchar(max)
Declare @TestSearch varchar(max)
Set @TestString = \'hello this is a Test:12356.jpg<br> reset of line\'
Set @TestSearch = \'Test:\'
Select Case
When CharIndex( @TestSearch,@TestSTring ) = 0 Then \'\'
When Left(Reverse( Z.Value ),Len(Z.Value)) = Reverse( Z.Value ) Then Z.Value
Else Substring( Value,PatIndex( \'%[<> ]%\',Value ) - 1 )
End
From ( Select Substring( @TestString,CharIndex( @TestSearch,@TestSTring ) + Len(@TestSearch),Len(@TestString )
) As Value ) As Z
我对解决方案进行了稍微修改,以解决搜索字符串恰好位于输入字符串末尾的情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。