2017-04-24 1 views
0

I는 [pageContent] FROM이 쿼리 선택 TOP 1 텍스트가 WHERE 페이지 id = 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

내가 지금까지 시도 빈 문자열로 전체 HTML 태그를 대체하고 분할 기능은 인터넷에서 가져온 사용하고 무엇
  1. .
  2. 함수를 사용하여 html 콘텐츠를 제거하고 split 함수를 사용하여 콘텐츠를 분할합니다. 무엇 내가 알고 싶은

, 라인이 포함 된 경우 문자열 '**[['로 시작하고 ']]**'로 끝나는 등 여러 행을 반환 할 수 있도록 패턴 필드에 맞게하는 방법이있다.

모든 의견을 크게 환영합니다.

+0

언제 당신은 당신이 아마 피벗 기능을 사용하려면, 열에 행 값을 변경하고 싶습니다. 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 걱정 할 필요가 없습니다 :

먼저 분할 문자열 함수를 만듭니다. 나는 아론 버트 랜드의 Split strings the right way – or the next best way 기사에서 가져온 제프 MODEN의 분할 문자열을 기반으로 기능을 사용했습니다 : 그런 다음

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.

관련 문제