4

我有两个连接的表。表 1 有客户数据,表 2 有他们的状态。

我需要进行通配符名称搜索,但我只希望它根据表 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 + '%' ) 
4

2 回答 2

0

Or 具有比 and 更高的运算符优先级,因此将查询更改为以下内容:

WHERE  ( DBO.CLIENT_STATUS.CLINIC_STATUS = @ClientStatus ) 
       AND (( DBO.CLIENTS.LAST_NAME LIKE @ClientName + '%' ) 
        OR ( DBO.CLIENTS.MOBILE_NUMBER LIKE @ClientName + '%' ))
于 2013-10-08T21:15:53.587 回答
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/空白输入。

于 2013-10-08T21:17:16.070 回答