2017-04-24 105 views
0

我有此查詢 SELECT TOP 1文本FROM [pageContent] WHERE的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> 

我想是,以返回開頭的數據'**[['並以​​結尾 返回爲3行。喜歡的東西下面,

enter image description here

  1. 我迄今試圖與空字符串替換整個HTML標籤和使用分割功能從網上找來的。
  2. 使用函數去除html內容並使用拆分功能拆分內容。

我想知道的是,是有辦法,這樣,如果行包含字符串'**[['開始,以​​結束,返回爲多行到模式匹配字段。

任何建議都不勝感激。

+0

任何時候你想改變行值成列,你可能想使用旋轉功能。 https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx或者你混淆了行和列?你的例子顯示3行數據與1(未命名)列。你確定你不希望你的結果顯示它們如何作爲行嗎? – EMUEVIL

+0

對不起。糾正了錯字。 – locknies

+0

您在這裏真正要求的東西似乎是「多行感知的正則表達式匹配器」,您無法在純SQL中執行此操作。你可以編寫一個可以從SQL調用的C#CLR函數,或者你可以在C#程序或者工具中進行處理......但是如果沒有,你會被拒絕使用REPLACE和一個字符串分割器來修補某些東西適用於您的特定數據。 – pmbAustin

回答

0

的字符串分路器是要走的路,但如果你這樣做是正確的,你不需要關心HTML不惜一切:

首先,創建分割字符串函數。我已經使用了基於傑夫MODEN的分裂字符串從亞倫Bertrand的Split strings the right way – or the next best way文章取一個函數:

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 

然後,(保存我們在你未來的問題,這一步)創建和填充示例表

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) 

現在,對於查詢我使用CROSS APPLY,並根據您的問題發佈查詢派生表:

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 '%**%**%' 

結果:

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.