2013-10-08 4 views
4

두 개의 조인 된 테이블이 있습니다. 표 1에는 클라이언트 데이터가 있고 표 2에는 상태가 있습니다.와일드 카드 변수로 SQL 테이블 조인

와일드 카드 이름 검색이 필요하지만 실제로는 테이블 2의 상태를 기반으로 결과를 반환하기를 원합니다.이 작업은 실제로 @ClientName 변수에 일부 데이터를 입력 할 때 작동하지만 비어있는 경우 모두 반환합니다. @ClientStatus 변수를 기록하고 무시합니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

DECLARE @ClientName NVARCHAR (100) = '' 
DECLARE @ClientStatus INT = 1 

SELECT DBO.CLIENTS.CLIENTID, 
     DBO.CLIENTS.FIRST_NAME, 
     DBO.CLIENTS.LAST_NAME, 
     DBO.CLIENTS.PHONE_NUMBER, 
     DBO.CLIENTS.MOBILE_NUMBER, 
     DBO.CLIENTS.HOUSE_ADDRESS_NUMBER, 
     DBO.CLIENTS.STREET_NAME, 
     DBO.CLIENTS.TOWN_CITY, 
     DBO.CLIENTS.POST_CODE, 
     DBO.CLIENTS.EMAIL_ADDRESS, 
     DBO.CLIENTS.CLIENT_SOURCE, 
     DBO.CLIENTS.CLIENT_STATUS, 
     DBO.CLIENTS.DATE_ADDED, 
     DBO.CLIENTS.CALL_DATE, 
     DBO.CLIENTS.CALL_TIME, 
     DBO.CLIENT_STATUS.CLINIC_STATUS 
FROM DBO.CLIENTS 
     INNER JOIN DBO.CLIENT_STATUS 
       ON DBO.CLIENTS.CLIENT_STATUS = DBO.CLIENT_STATUS.STATUSID 
WHERE (DBO.CLIENT_STATUS.CLINIC_STATUS = @ClientStatus) 
     AND (DBO.CLIENTS.LAST_NAME LIKE @ClientName + '%') 
     OR (DBO.CLIENTS.MOBILE_NUMBER LIKE @ClientName + '%') 

답변

0

우선 그것은 변수를 무시 아니에요, 더 중요한

AND ((DBO.CLIENTS.LAST_NAME LIKE @ClientName + '%') 
    OR (DBO.CLIENTS.MOBILE_NUMBER LIKE @ClientName + '%')) 

AND보다 높은 우선 순위를 가지고있다. 당신이 @ClientName 아무것도를 제공하지 않을 경우 최종 상태는 % 이후

(DBO.CLIENTS.LAST_NAME LIKE '%') 
    OR (DBO.CLIENTS.MOBILE_NUMBER LIKE '%') 

는 와일드 카드가된다 당신은 아무것도에 맞게 말하는 것입니다. 이 문제를 해결하려면 이름을 전달하거나 NULL/빈 입력을 처리해야합니다.

0

또는보다 높은 연산자 우선 순위를 가지고 있으며, 그래서 다음에 쿼리를 변경합니다, 당신이 실제로 이후 그룹에 OR 조건을 원하는 추측거야 모든

WHERE (DBO.CLIENT_STATUS.CLINIC_STATUS = @ClientStatus) 
     AND ((DBO.CLIENTS.LAST_NAME LIKE @ClientName + '%') 
     OR (DBO.CLIENTS.MOBILE_NUMBER LIKE @ClientName + '%')) 
+0

위대한 노아 - 완벽하게 작동합니다. – gillers322