2014-09-15 1 views
1

질문이 있으시면 사과하겠습니다. MS SQL을 사용하고 있습니다. 텍스트 필드에서 3 가지 특정 항목을 찾고 있습니다. IH-, MPC 또는 ICC. 텍스트 필드에 이러한 항목이 있으면 해당 항목이 발견되었음을 나타내려고합니다. 첫 번째 행에서 3 개가 모두 발견되면 IH-, MPC, ICC가 포함 된 필드가 있습니다. 여기가 제 쿼리입니다.좋아요를 선택한 후 발견되면 결과가 표시된 열을 추가하십시오.

SELECT  tt.TITLE, tt.ITEM_REFERENCE_ID, tt.VERSION, PATH_MAPPINGS.PATH, tt.CONTENT 
FROM   ITEM_REFERENCES INNER JOIN 
PATH_MAPPINGS ON ITEM_REFERENCES.ORGANIZATIONAL_ITEM_ID = PATH_MAPPINGS.ORGANIZATIONAL_ITEM_ID INNER 
JOIN 
ITEMS AS tt INNER JOIN 

         (SELECT  ITEM_REFERENCE_ID, MAX(VERSION) AS MaxVersion 
FROM   ITEMS 
         GROUP BY ITEM_REFERENCE_ID) AS groupedtt ON tt.ITEM_REFERENCE_ID = groupedtt.ITEM_REFERENCE_ID AND tt.VERSION = groupedtt.MaxVersion ON 
ITEM_REFERENCES.ID = tt.ITEM_REFERENCE_ID 

WHERE (tt.CONTENT LIKE '%<text>AP[0-2]%' ) 
or 

(tt.CONTENT LIKE '%<text>IH-[0-2]%' ) 
or 

(tt.CONTENT LIKE '%<text>MPC[0-2]%' ) 
or 
(tt.CONTENT LIKE '%<text>ICC[0-2]%' ) 
+0

내 의견으로는이 스크립트를 작성해야합니다. MySQL은 단순히 열을 동적으로 추가 할 수 없습니다. 'IF (title LIKE ..., 1, 0) AS matched_on_title AS'와 같은 모든 열을 반복 할 수 있습니다. – twicejr

+0

왜이 옵션이 필요한가요? 모든 옵션을 추가하는 옵션이 아닌가요? 스크립트는 부울 비교합니까? – twicejr

답변

0

는에 검색 기준을 들고 임시 테이블을 만드는 것입니다 원본 데이터와 대조하십시오.

임시 테이블은 CTE이 충분의 값을 변경, 다음 쿼리 패턴이 변수 부분이 질문에

WITH ContentPattern AS (
    SELECT '%blue%' c 
    UNION ALL 
    SELECT '%red%' 
    UNION ALL 
    SELECT '%at%' 
    UNION ALL 
    SELECT '%green%' 
    UNION ALL 
    SELECT '%orange%' 
) 
SELECT a.[field], f.Found 
FROM Table1 a 
     CROSS APPLY (SELECT STUFF((SELECT ', ' + cp.c 
            FROM ContentPattern cp 
            WHERE PATINDEX(cp.c, a.[field]) > 0 
            GROUP BY cp.c 
            HAVING COUNT(cp.c) > 0 
            FOR XML PATH(''), TYPE 
           ).value('.', 'NVARCHAR(MAX)') 
           , 1, 1, '') Found) f 

SQLFiddle demo

에 같은 CTE이 될 수 있지만, 조금 더 할 수 있습니다 : 검색 기준 대신 실제 가치를 얻으십시오. 이를 위해 우리는 패턴의 길이하고, 그것을 미리 계산 어떤 방법으로하고, 임시 테이블에 추가 ...입니다 얻을 수있는 가장 쉬운 방법/CTE

WITH ContentPattern AS (
    SELECT '%blue[0-2]%' c, 5 l 
    UNION ALL 
    SELECT '%red[0-2]%', 4 
    UNION ALL 
    SELECT '%at[0-2]%', 3 
    UNION ALL 
    SELECT '%green%', 5 
    UNION ALL 
    SELECT '%orange%', 6 
) 
SELECT a.[field], f.Found 
FROM Table1 a 
     CROSS APPLY (
      SELECT STUFF((
        SELECT ', ' 
         + SUBSTRING(a.[field], PATINDEX(cp.c, a.[field]), cp.l) 
        FROM ContentPattern cp 
        WHERE PATINDEX(cp.c, a.[field]) > 0 
        GROUP BY cp.c, cp.l 
        HAVING COUNT(cp.c) > 0 
        FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
        , 1, 1, '') Found) f 

SQLFiddle demo 필요 필드가 쿼리에 따라 내용 중 어느 것도 패턴을 검색하지 않은 경우에도

는 모든 행을 제거 할 수 있습니다하는 NULL 값으로, 결과에 Found 필드의 LENWHERE 조건을 서 있습니다 그것은 일치하지 않습니다.

+0

정보 부족으로 사과드립니다. MS SQL을 사용하고 있으며 실제로 세 가지 선택 사항 중 하나를 포함 할 수있는 텍스트 필드를 검색하려고합니다. IH-, MPC 또는 ICC. 지금까지 가지고있는 코드는 다음과 같습니다. – BryanD

+0

나는 최근에 내 질문에 추가 한 내 쿼리로이 작업을 수행하는 방법을 알아 내려고하고 있습니다. 이것은 내가 찾고있는 것이다. 내 기존 코드를 보셨습니까? – BryanD

+0

그래,이게 내가 원하는거야. 또한 원래 질문에 원하는 검색 기준으로 샘플 쿼리를 제공했습니다. 그걸 볼 수 있니? 도움 주셔서 감사합니다. – BryanD

0
Select Case When FIELD Like '%BLUE%' Then 'BLUE' 
     Else When FIELD Like '%RED%' Then 'RED' 
     Else When FIELD Like '%AT%' Then 'AT' End 
From Table 
Where (FIELD Like '%BLUE%' 
     Or FIELD Like '%RED%' 
     Or FIELD Like '%AT%') 
0

포스트 그레스 :

select 
    (blue like '%blue%') as found_blue, 
    (blue like '%red%') as found_red 
from (select '***blue***'::text as blue) t; 

found_blue │ found_red 
────────────┼─────────── 
t   │ f 
(1 row) 

MySQL의 : 내용 만 하나 개의 개념을 단순화 된 데이터 테이블을 사용

select  
(blue like '%blue%') as found_blue, 
(blue like '%red%') as found_red 
from (select '***blue***' as blue) t; 
+------------+-----------+ 
| found_blue | found_red | 
+------------+-----------+ 
|   1 |   0 | 
+------------+-----------+ 
1 row in set (0.02 sec) 
관련 문제