SQL Trim все от первого и последнего строкового индикатора - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу очистить столбец, содержащий нежелательные теги в SQL.

Данные выглядят так:

<"blockquote class="twitter-tweet" data-lang="en"> *some text*  <"/blockquote>
"I must remain" <"blockquote class="twitter-tweet" data-lang="en"> *some text again*<"/blockquote>
"I must remain, too" <"blockquote class="twitter-tweet" data-lang="en"> *some text again*<"/blockquote>

Я хочу удалить все, начиная с <"blockquote </em> до <" / blockquote> , что очищенные данные станут: «Я должен остаться» «Я должен остаться тоже»

Я хочу сделать это, чтобы быть функцией SQL для очистки данных.

** Я хочу удалить всю строку, начиная с <"blockquote </em> до <" / blockquote> , а затем сохранить те строки, которые не содержатся между ними.

Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Пожалуйста, используйте это. @data - это ваша строка:

declare @data_xml xml = replace(@data, '<"', '<');
select convert(nvarchar(max), @data_xml.query('text()'));

Полный запрос: https://pastebin.com/mJpfmYyQ

0 голосов
/ 30 апреля 2018

Таким образом, я смог получить желаемый результат, используя запрос ниже:

DECLARE @Tbl TABLE(VAL VARCHAR(MAX));
INSERT @Tbl VALUES('<"blockquote class="twitter-tweet" data-lang="en"> *some text*  <"/blockquote>
"I must remain" <"blockquote class="twitter-tweet" data-lang="en"> *some text again*<"/blockquote>
"I must remain, too" <"blockquote class="twitter-tweet" data-lang="en"> *some text again*<"/blockquote>');
SELECT 1; --initialize @@ROWCOUNT if necessary. Might be optional depending on need
WHILE @@ROWCOUNT > 0 BEGIN
    UPDATE @Tbl
    SET VAL = STUFF(VAL,CHARINDEX('<"blockquote',VAL),CHARINDEX('<"/blockquote>',VAL) - CHARINDEX('<"blockquote',VAL) + 14,'')
    WHERE VAL LIKE '%<%>%'
END
SELECT * FROM @Tbl;
0 голосов
/ 27 апреля 2018

Если открыто для TVF ...

Надоело извлекать строки (left, right, patindex, substrings, ...), я изменил функцию синтаксического анализа, чтобы принимать два не похожих на разделители

Будучи TVF, его легко использовать как CROSS APPLY или как отдельное устройство.

Также не ясно, желаемых результатов. Если вам нужна одна строка, а не записи, вы можете легко объединить ее с помощью метода XML STUFF ().

Пример

Declare @S varchar(max) = '<blockquote class="twitter-tweet" data-lang="en"> *some text*  </blockquote>"I must remain" <blockquote class="twitter-tweet" data-lang="en"> *some text again*</blockquote>"I must remain, too" <blockquote class="twitter-tweet" data-lang="en"> *some text again*</blockquote>'

Select * from [dbo].[tvf-Str-Extract](@S,'blockquote>','<blockquote')

Возвращает

RetSeq  RetPos  RetVal
1       77      "I must remain" 
2       173     "I must remain, too" 

UDF, если интересно

ALTER FUNCTION [dbo].[tvf-Str-Extract] (@String varchar(max),@Delimiter1 varchar(100),@Delimiter2 varchar(100))
Returns Table 
As
Return (  

with   cte1(N)   As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
       cte2(N)   As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 N1,cte1 N2,cte1 N3,cte1 N4,cte1 N5,cte1 N6) A ),
       cte3(N)   As (Select 1 Union All Select t.N+DataLength(@Delimiter1) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter1)) = @Delimiter1),
       cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter1,@String,s.N),0)-S.N,8000) From cte3 S)

Select RetSeq = Row_Number() over (Order By N)
      ,RetPos = N
      ,RetVal = left(RetVal,charindex(@Delimiter2,RetVal)-1) 
 From  (
        Select *,RetVal = Substring(@String, N, L) 
         From  cte4
       ) A
 Where charindex(@Delimiter2,RetVal)>1

)
/*
Max Length of String 1MM characters

Declare @String varchar(max) = 'Dear [[FirstName]] [[LastName]], ...'
Select * From [dbo].[tvf-Str-Extract] (@String,'[[',']]')
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...