2017-04-24 12 views
0

私は[pageContent] pageidに= 5パターンマッチを使用して単一の列から複数の行として値を返しますか?

は、私が欲しいものより低い値、

<table style="width: 100%;border:none !important"> 
     <tr style="border:none !important"> 
      <td style="border:none !important"> 

**[[http://mypage.com/123/data1|data1]]** 

**[[http://mypage.com/345/data2|data2]]** 

**[[http://mypage.com/567/data3|data3]]** 

      </td> 
     </tr> 
</table> 

を持つフィールドを返すWHERE FROMこのクエリ SELECT TOP 1文字で始まるデータを戻すことである必要があり'**[['で終わり、​​で終わり、 が3行として返されます。以下、iは、空の文字列で全体のhtmlタグを置き換えると、インターネットから得たsplit関数を使用し、これまでに試してみましたが何

enter image description here

  1. ような何か。
  2. 関数を使用してhtmlコンテンツを取り除き、split関数を使用してコンテンツを分割します。ある何私が知りたい

、行が含まれている場合、文字列は'**[['で始まり、​​で終わり、などの複数の行を返すように、パターンフィールドに一致するようにする方法があります。

ご意見をいただければ幸いです。

+0

いつでもあなたは、おそらくPIVOT機能を使用する場合は、列に行の値を変更したいです。 https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspxまたはあなたは行と列を混同していますか?あなたの例は、1(無名)の列を持つ3行のデータを示しています。結果が行と同じように表示されないようにしてもよろしいですか? – EMUEVIL

+0

申し訳ありません。入力ミスを修正しました。 – locknies

+0

あなたが本当に求めているのは、純粋なSQLではできない「マルチライン対応の正規表現マッチャー」のようです。 SQLから呼び出せるC#CLR関数を書くこともできますし、C#プログラムやユーティリティで実際に処理を行うこともできますが、そうでなければ、REPLACEと文字列スプリッタを使ってパッチを張りますあなたの特定のデータのために働く。 – pmbAustin

答えて

0

文字列スプリッタが移動するための方法ですが、あなたは右のそれを行う場合、あなたは、すべてのHTMLを気にする必要はありません。まず

、分割文字列関数を作成します。

CREATE TABLE pageContent 
(
    [text] varchar(1000), 
    pageid int 
) 

INSERT INTO pageContent VALUES 
('<table style="width: 100%;border:none !important"> 
     <tr style="border:none !important"> 
      <td style="border:none !important"> 

**[[http://mypage.com/123/data1|data1]]** 

**[[http://mypage.com/345/data2|data2]]** 

**[[http://mypage.com/567/data3|data3]]** 

      </td> 
     </tr> 
</table>', 5) 
くださいは私たちにあなたの将来の質問では、このステップを保存)サンプルテーブルを作成し、移入、その後

CREATE FUNCTION dbo.SplitStrings 
(
    @List NVARCHAR(MAX), 
    @Delimiter NVARCHAR(255) 
) 
RETURNS TABLE 
WITH SCHEMABINDING AS 
RETURN 
    WITH E1(N)  AS (SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
         UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
         UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1), 
     E2(N)  AS (SELECT 1 FROM E1 a, E1 b), 
     E4(N)  AS (SELECT 1 FROM E2 a, E2 b), 
     E42(N)  AS (SELECT 1 FROM E4 a, E2 b), 
     cteTally(N) AS (SELECT 0 UNION ALL SELECT TOP (DATALENGTH(ISNULL(@List,1))) 
         ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E42), 
     cteStart(N1) AS (SELECT t.N+1 FROM cteTally t 
         WHERE (SUBSTRING(@List,t.N,1) = @Delimiter OR t.N = 0)) 
    SELECT Item = SUBSTRING(@List, s.N1, ISNULL(NULLIF(CHARINDEX(@Delimiter,@List,s.N1),0)-s.N1,8000)) 
    FROM cteStart s; 

GO 

:私はアーロンベルトランのSplit strings the right way – or the next best way記事から取ったジェフMODENの分割文字列に基づいた機能を使用しました

SELECT LTRIM(RTRIM(Item)) As Content 
FROM 
(
    SELECT TOP 1 text FROM [pageContent] WHERE pageid = 5 
) query 
CROSS APPLY 
dbo.SplitStrings(text, char(10)) 
WHERE Item LIKE '%**%**%' 
:私は CROSS APPLYを使用しましたクエリとあなたが質問に投稿されたクエリに基づいて派生テーブルのための今

、の

結果:

Content 
**[[http://mypage.com/123/data1|data1]]** 
**[[http://mypage.com/345/data2|data2]]** 
**[[http://mypage.com/567/data3|data3]]** 

You can see a live demo on rextester.

関連する問題