2011-09-23 4 views
1

나는 다음과 같은 몇 가지 쿼리를 작성 : LIKE 쿼리를 작성하는 또 다른 스타일이 있습니까?

SELECT * 
FROM Sample.dbo.Temp 
WHERE 
    Name LIKE (
      '%ab%' 
      OR '%fg%' 
      OR '%asd%' 
      OR ... 
      OR ... 
      OR '%kj%' 
      ) 

그냥보기 및 관리의 가독성 지점에서 모두 더 편안 같습니다

SELECT * 
FROM Sample.dbo.Temp 
WHERE 
    Name LIKE '%ab%' 
OR Name LIKE '%fg%' 
OR NAME LIKE '%asd%' 
OR ... 
OR ... 
OR Name LIKE '%kj%' 

어쨌든 나는이 같은이 쿼리가 다시 작성할 수 있습니다입니다. 열 Name이 변경되면 백 대신 (또는 Find and Replace을 사용하여) 한 번만 변경할 수 있습니다. 어떤 제안?

+1

아니요. BTW : LIKE 검색 기준 앞에 와일드 카드를 접두어로 붙이면 사용 가능한 모든 인덱스의 유용성이 줄어 듭니다. –

답변

2

아니, 당신은 아마 그런 일을 작동하도록 조금 주위를 속일 수 있지만, 그것은 예뻐 이상 읽을 수 없습니다 것 LIKE

을 계속 반복해야합니다.

아마 수동으로 작성하는 대신 프로그래밍 방식으로 쿼리를 생성해야합니까?

추신 : 여기에서 전체 텍스트 인덱스가 더 좋은 아이디어일까요?

+0

좋아요! 제안 해 주셔서 감사합니다. 제한 시간이 지나면 답변으로이를 수락합니다. – Legend

+0

@Legend : 'LIKE'% ... ''쿼리 (즉,'% '로 시작하는 인덱스는 사용할 수 없으므로 느린 쿼리가됩니다.)에서 전체 텍스트 검색을 사용하는 것이 좋습니다 : – Wolph

+0

예 . 명확히. 이미 fulltext 인덱스를 추가했습니다 : – Legend

2

값을 테이블에 넣을 수 있습니다 (예 : CTE). 긴 호흡 보이지만 CTE 대신 매개 변수 값의 목록은 향후 변경해야하는 경우 쿼리 즉 데이터 - 구동 될 수있는 그 기본 테이블 인 경우 다음 오히려 테이블을 갱신 단지 포함 할

WITH params 
    AS 
    (
     SELECT * 
     FROM (
       VALUES ('at'), 
        ('fg'), 
        ('asd'), 
        ('kj') 
      ) AS T (param) 
    ) 
SELECT * 
    FROM Sample.dbo.Temp T 
WHERE EXISTS (
       SELECT * 
       FROM params P 
       WHERE T.Name LIKE '%' + P.param + '%' 
      ); 

하드 코딩 된 값을 수정하는 것 (여러 객체에 포함 가능).

+0

+ 1.이 솔루션이 마음에 들었습니다. 각 결합에 대해 추가하는 대신 param에 %를 포함 시키면 약간 더 나은 성능을 얻을 수 있다고 생각합니다. –

+0

@ t-clausen.dk : 논리적이고 유망한 것으로 들리지만 테스트를 받아야합니다. – onedaywhen