提取字符串的SQL函数

时间:2011-04-13 20:39:51

标签: sql string tsql function extraction

prior question开始,此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, charindex(@part,@full)+datalength(@part)/2 -1, '')) 
end 
go 

3 个答案:

答案 0 :(得分:2)

当T-SQL真的不专注于文本解析时,我建议使用正则表达式(如果您使用的是SQL Server 2005或更高版本),而不是尝试继续调整字符串解析函数。你可以在互联网上找到很多关于这些的确切CLR代码的例子,或者你可以在http://www.SQLsharp.com下载免费的SQL#库(我写的)并立即开始使用它们。以下是一些使用您特定情况的示例:

SELECT SQL#.RegEx_CaptureGroup('hello this is a Test:12356.jpg<br> reset of line',  
           'Test:([^ ]+)<br>', 1, NULL, 1, -1, '')
-- 12356.jpg

SELECT SQL#.RegEx_CaptureGroup('hello this is a Test:<br> reset of line',  
           'Test:([^ ]+)<br>', 1, NULL, 1, -1, '')
-- NULL

SELECT SQL#.RegEx_CaptureGroup('hello this is a T:12356.jpg<br> reset of line',  
           'Test:([^ ]+)<br>', 1, NULL, 1, -1, '')
-- NULL

在每种情况下,模式匹配以单词“Test:”开头,然后抓取任何非空格字符,直到它到达“&lt; br&gt;” (或者因为它正在寻找非空间的空间)。如果由于“Test:”和“&lt; br&gt;”之间没有找到而未找到或者如果“Test:”不在那里,则返回NULL。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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, 1, PatIndex( '%[<> ]%', Value ) - 1 )
        End
From ( Select Substring( @TestString
                , CharIndex( @TestSearch, @TestSTring ) + Len(@TestSearch)
                , Len(@TestString )
    ) As Value ) As Z

我稍微修改了我的解决方案,以解决搜索字符串碰巧位于输入字符串末尾的情况。