2017-06-01 20 views
0

フィールドにHTMLを格納したSQLテーブルがあります。このHTMLの一部を置き換える必要があります。私はこの結果を得る一致する文字列の最後の文字を取得

SELECT [Id_Of_Content], 
PATINDEX('<!DOCTYPE%%<!-- MAIN CONTENT -->%<td%>', [Content]) AS StartIndex, 
PATINDEX('%<!-- MAIN CONTENT -->%<td%>', [Content]) AS EndIndex 
FROM MyTable 

ContentId | StartIndex | EndIndex 
1   1   5825 
2   1   5819 

は今、開始インデックスをとして、正しい今

<!DOCTYPE html 
...... //more html 
<!-- MAIN CONTENT --> 
<table> 
    <tr> 
     <td ...... /> 

、このクエリを使用した:値の例は、この可能性があり<!DOCTYPE要素は常に自分のHTMLの一番上にあります。しかし、最後のインデックスは、私が望むものではありません。検索される文字列の最初の文字のインデックスです。この場合、<です。 <td%>>文字のインデックスが必要です。どのように私はこれを得ることができますか?

+0

あなたは、その文字列の後に続くものを検索し、そのインデックスを使用する必要があります。ここの問題は、あなたが本当にこのようなことをするつもりではないツールを使用しているということです。これをSQLを使用して簡単に行うことができない理由は、SQLが間違ったツールであるためです。この種の処理は、正規表現を完全にサポートするなどの優れたツールを備えた適切なプログラミング言語で行う必要があります。 –

+0

フィードバックありがとうございます。これは一度のスクリプトのため、C#で何かを書く考えは私には起こりませんでした。私は、私の希望する文字の後に来るものの開始インデックスを見つけることを試みるつもりです。 – ohyeah

答えて

0

まず、「メインコンテンツ」が始まる位置を見つけます。 次に、「TD」が始まる位置を見つけます。 次に、「>」が始まる位置を見つけます。

-2は、 '! - メインコンテンツ'と 'TD'の '<'のもので、2回カウントされます。

このコードはあなたの例では機能しますが、TDタグが複数ある場合(最初のタグを使用する場合)と異なる場合があります。

declare @content varchar(max) = '<!DOCTYPE html 
...... //more html 
<!-- MAIN CONTENT --> 
<table> 
    <tr> 
     <td ...... />' 

Select EndInSub+TDStartInSub+MainContentStart-2 EndIndex 
from(
    select Patindex('%>',[TDSub]) [EndInSub],* 
    from( 
     Select SUBSTRING([MainContentSub],[TDStartInSub], [Total Length]) [TDSub],* 
     from (
      select PATINDEX('%<td%>',[MainContentSub])[TDStartInSub],* 
      from (
       select substring(@content,[MainContentStart],[Total Length]) [MainContentSub],* 
       from(
        select PATINDEX('%<!-- MAIN CONTENT -->%<td%>',@content) [MainContentStart], len(@content) [Total Length]) A)B)C)D)E 
関連する問題