2013-05-24 6 views
1

LIKE 검색에 대한 빠른 질문. 'Analyst, Trainer'값과 'Workflow, Analyst, Tester, Trainer'값이있는 열이있는 경우 첫 번째 열의 값이 두 번째 열에 있는지 확인하고 싶습니다. 우리는 대답이 '예'라는 것을 쉽게 볼 수 있지만 순서가 맞지 않아 비교할 수는 없습니다.쉼표로 구분 된 데이터에서 TSql LIKE 검색

아이디어를 얻는 방법은 무엇입니까? 두 값을 모두 전달하는 함수를 작성하고 두 함수 모두에 분할 루틴을 수행합니까? 더 쉬운 방법이있는 것처럼 보입니다.

귀 기울여 감사합니다. 이것은 아마도 스크립트와 함께 할 더 나은 동안

데이비드

+0

잘 모르겠지만 [FIND_IN_SET] (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set)을 (를) 찾을 수 있습니다 – rcpayan

+1

SQL 행 기반 데이터 용으로 설계되었으며 대규모 조인을 쉽게 수행 할 수 있습니다. csv 정보를 먼저 여러 행으로 분해하고 간단한 조인을하는 것이 더 좋습니다. –

+0

이것은 Sql Server이다. –

답변

1

, SQL에 시도하는 것이 재미 있었다.

먼저 행 식별자가 필요합니다. 여기에는 ROW_NUMBER()이 사용됩니다. 다음으로 쉼표로 구분 된 목록을 위로 나눌 때 CROSS APPLY을 사용할 수 있습니다. 그런 다음 목록을 적절하게 비교할 수 있습니다. 여기

은 작업 예입니다

WITH YOURTABLE_WITH_RN AS (
    SELECT ROW_NUMBER() OVER (ORDER BY col1) rn, 
    col1, 
    col2 
    FROM YourTable 
), 
YOURTABLE_COL1 AS (
    SELECT rn, 
    Split.a.value('.', 'VARCHAR(100)') AS col1 
    FROM 
    (
    SELECT ROW_NUMBER() OVER (ORDER BY col1) rn, 
     CAST ('<M>' + REPLACE(col1, ',', '</M><M>') + '</M>' AS XML) AS col1 
    FROM YourTable 
) AS A 
    CROSS APPLY col1.nodes ('/M') AS Split(a) 
), 
YOURTABLE_COL2 AS (
    SELECT rn, 
    Split.a.value('.', 'VARCHAR(100)') AS col2 
    FROM 
    (
    SELECT ROW_NUMBER() OVER (ORDER BY col1) rn, 
     CAST ('<M>' + REPLACE(col2, ',', '</M><M>') + '</M>' AS XML) AS col2 
    FROM YourTable 
) AS A 
    CROSS APPLY col2.nodes ('/M') AS Split(a) 
) 
SELECT T.rn, 
    T.col1, 
    T.col2, 
    CASE WHEN T2.rn IS NULL THEN 'Y' ELSE 'N' END AllIncluded 
FROM YOURTABLE_WITH_RN T 
    LEFT JOIN (
    SELECT T.rn 
    FROM YOURTABLE_COL1 T 
     LEFT JOIN YOURTABLE_COL2 T2 ON T.rn = T2.rn AND T.col1 = T2.col2 
    WHERE T2.rn IS NULL 
    ) T2 ON T.rn = T2.rn 

SQL Fiddle Demo

첫 번째 CTE (공통 테이블 식)가 필요하지 않을 또는 이미 테이블에 고유 식별자가있는 경우 ROW_NUMBER()를 사용하는 .

0

그래, 나는 거대한 데이터 세트를 다룰 때 이런 식으로 약간의 노력을 생각했다. 나는 실제로 얼마 전에 체스 프로그래밍을했고, 'Analyst, Tester, Trainer'와 같은 값을 각각의 테이블에있는 비트 값으로 변환하는 것으로 생각합니다. 그래서 여기서 볼 수있는 값은 7 (1,2,4) 그리고 나서 'Analyst, Trainer'가 5 (1,4)가 될 수 있습니다. 'Analyst, Trainer'가 'Analyst, Tester, Trainer'내에 있는지 테스트하고 싶다면 (7 & 5) = 5 일 수 있습니다. 그것은 효과가있을 것입니다. 이것은 체스 조각이 공격하는 사각형에 있는지 테스트 할 수있는 방법입니다. 이것이 왜 나에게 이전에 일어나지 않았는지 확실하지 않습니다. 댓글을 주셔서 감사합니다.

0

XQuery 메서드 (노드, 값)를 사용하여 'Analyst, Trainer'값으로 열을 분할 한 다음 LIKE 연산자를 사용하여 'Workflow, Analyst, Tester, Trainer'값과 비교할 수 있습니다.

SELECT FULLTEXTSERVICEPROPERTY ('IsFulltextInstalled') 

0 = 전체 텍스트 :

SELECT t.col1, t.col2, MIN(CASE WHEN t.col2 LIKE '%' + o.col1 + '%' 
           THEN 1 ELSE 0 END) AS IsMatch 
FROM YourTable t 
    CROSS APPLY 
    (
    SELECT Split.a.value('.', 'nvarchar(100)') 
    FROM (  
      SELECT CAST('<M>'+REPLACE(t.col1,',','</M><M>')+'</M>' AS xml) AS col1 
      ) AS a 
    CROSS APPLY col1.nodes('/M') AS Split(a) 
    ) o(col1) 
GROUP BY t.col1, t.col2 

SQLFiddle

에 대한 데모는 또한 당신은 당신이 구성 요소가 설치된 전체 텍스트를 확인할 필요가 스크립트 실행하기 전에 동적 관리 함수 sys.dm_fts_parser 과 옵션을 사용할 수 있습니다 설치되어 있지 않습니다. 1 = 전체 텍스트가 설치되었습니다. NULL = 입력 또는 오류가 잘못되었습니다. 0 = 전체 텍스트가 다음 설치되어 있지

경우이 게시물 정렬 작업을 피하기 위해 당신 How to install fulltext on sql server 2008?

SELECT t.col1, t.col2, MIN(CASE WHEN t.col2 LIKE '%' + o.col1 + '%' 
           THEN 1 ELSE 0 END) AS IsMatch 
FROM YourTable t 
    CROSS APPLY (
       SELECT display_term 
       FROM sys.dm_fts_parser('"'+ 'nn,' + t.col1 + '"', 1033, NULL, 0) 
       WHERE display_term NOT LIKE 'nn%' 
       ) o(col1) 
GROUP BY t.col1, t.col2 

할 필요가 사용 지수 : 참고로

CREATE INDEX x ON YourTable(col1, col2) 

, 가장 성능이 될 것입니다 sys와dm_fts_parser