2013-10-08 68 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

首先,我要猜你真的想將你的OR條件,因爲它具有比AND

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

更高的優先級更重要的是,它沒有忽略變量。當你不爲@ClientName提供任何最終條件變爲

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

由於%是通配符,你告訴它匹配任何東西。爲了解決這個問題,你要麼需要傳入一個名字,要麼以某種方式處理NULL /空白輸入。

0

或者具有更高的運算符優先級比和,因此更改查詢到以下幾點:

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

這就是偉大的諾亞 - 完美的作品 – gillers322