2016-12-08 4 views
1
select C.CardNumber, C.Name, Text5, Text3 from Access.Credential C 
    left join Access.Personnel P 
    on C.Name = P.Name 
    where C.Active = 1 
    and C.Name not like '%Spare%' 
    and Text3 like 'IT%' 
    or Text5 like '%IT %' 
    order by Text5 

관리자 및 계약자를 포함한 모든 IT 인력에 대한 쿼리 작성. 텍스트 5는 직원 제목이고 텍스트 3은 IT 부서입니다. text3 또는 text5 열의 제목 만 IT에 포함되도록하고 싶습니다. 나는 거의 다 왔지만 '신용'과 다른 것들을 얻고있다.제목이 'IT'인 모든 직원을 쿼리하는 방법

명심할 사항. IT가 MGR IT와 같은 제목 (텍스트 5)에서 항상 첫 번째 것은 아닙니다.

도움을 주시면 감사하겠습니다.

답변

4

그것은 당신이이 조건을 찾고 있습니다 생각 :

where C.Active = 1 and 
     C.Name not like '%Spare%' and 
     ' ' + Text3 + ' ' like '% IT %' 

이 텍스트의 시작과 끝에 공백을 추가 한 다음 공백으로 둘러싸인 IT을 찾습니다.

+0

나는'and', no? – scsimon

+0

@scsimon. . . 고맙습니다. –

+0

고든 걱정 없음 – scsimon

0

OR 조건을 그룹화하여 시도해보십시오.

Where C.Active = 1 
and C.Name not like '%Spare%' 
and (Text3 like 'IT%' or Text5 like '% IT %') 
0

LIKE 인덱스를 사용하고 꽤 심하게 수행 할 가능성이 없습니다 사용하여 문자 컬럼의 중간에서 텍스트를 검색. 스키마에 대한 관리가 있거나 (그렇지 않은 사람과 좋은 친구 인 경우) 전체 텍스트 쿼리를 사용하는 것이 좋습니다. 이렇게하려면 검색 가능한 테이블에 전체 텍스트 인덱스를 추가해야하지만 이러한 검색 유형이 공통적 인 경우 문제가 될만한 가치가 있습니다.

https://msdn.microsoft.com/en-us/library/ms142571.aspx 필터 등의 기술 설명에 의해 연기하지 마십시오 자세한 내용은

여기 봐. "정상적인"문자 데이터의 경우 필수 필터가 이미 있습니다. 그냥 테이블에 인덱스를 넣으면 SQL은 텍스트 열을 "크롤링"하고 텍스트의 단어에서 훌륭한 인덱스를 작성합니다.

select 
    C.CardNumber, C.Name, Text5, Text3 
from 
    Access.Credential C 
    left outer join 
    Access.Personnel P 
    on 
    C.Name = P.Name 
where 
    C.Active = 1 and 
    not contains(C.Name'Spare') and 
    (
    contains(Text3, 'IT') or 
    contains(Text5, 'IT') 
) 
order by 
    Text5 

사소한 관찰의 커플 :

그런 다음 쿼리 같이 보입니다

그것의 표는 텍스트 3 또는 Text5 열을 포함하는 쿼리 전혀 분명하지 않다. 다음에 오는 사람을 돕기 위해 모든 참조 된 컬럼에 별명 (C 또는 P)을 붙이는 것이 좋습니다.

또한 표현식 주위에 괄호를 사용하여 andor 개의 조건을 조합 할 때 미묘한 논리 오류를 피하십시오. 나는 그들을 으로 바 꾸었습니다. 당신이 의미했다고 생각합니다. 그러나 나는 잘못 이해했을 수도 있습니다. ;-)