2011-04-13 84 views
1

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

回答

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 
+0

谢谢!非常干净,似乎很好! – o365spo 2011-04-14 20:51:52

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 

我稍微修改我的解决方案,以说明搜索字符串恰好是在方案输入字符串的结尾。

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 

在每种情况下,模式匹配开头的单词“测试:”然后抓住任何非空格字符,直到达到“< BR>”(或因为它正在寻找非空间)。如果没有找到,由于之间没有任何东西是“试验”和“< BR>”或者“测试:”是不是有,首先,它返回NULL。

+0

谢谢您的解决方案。我同意我应该使用CLR。这肯定会更强大。我保存这个回去。现在我们的DBA正在休假,我相信我需要在服务器上添加权限来设置它。 – o365spo 2011-04-14 20:53:52