Функция SQL, которая извлекает строки - PullRequest
1 голос
/ 14 апреля 2011

Из предыдущего вопроса эта функция SQL извлекает строки, следующие за заданной строкой.

, поэтому

extractAfter("hello this is a Test:12356.jpg reset of line","Test:")

возвращает: 12356.jpg

Это работает, но мне нужно настроить его, чтобы рассмотреть две другие вещи:

  • в дополнение к пробелам строка должна заканчиваться, когда встречается "<" </li>
  • , что если нет совпаденияЯ хотел бы вернуть 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 ]

2 голосов
/ 14 апреля 2011

Вместо того, чтобы пытаться настроить функцию синтаксического анализа строк, когда T-SQL действительно не специализируется на синтаксическом анализе текста, я бы порекомендовал использовать регулярные выражения, если вы используете SQL Server 2005 или новее. В Интернете вы можете найти множество примеров точного кода CLR для них или вы можете скачать бесплатную библиотеку SQL # (которую я написал) по адресу http://www.SQLsharp.com и сразу начать использовать их. Вот несколько примеров использования вашей конкретной ситуации:

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:», а затем захватывает любые непробельные символы, пока не достигнет «
» (или пробела, так как оно ищет не пробел). Если не найдено из-за того, что между «Test:» и «
» ничего нет или «Test:» не существует, возвращается NULL.

1 голос
/ 14 апреля 2011
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 голосов
/ 14 апреля 2011
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

Я немного изменил свое решение, чтобы учесть сценарий, в котором строка поиска оказывается в конце входной строки.

...