2011-04-13 140 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