带有通配符变量的SQL表联接
我有两张相连的桌子。表1有客户端数据,表2有它们的状态 我需要一个通配符名称搜索,但我只希望它根据表2中的状态返回结果。当我在@ClientName变量中实际输入一些数据时,这种方法会起作用,但当该变量为空时,它会返回所有记录并忽略@ClientStatus变量。有没有办法解决这个问题带有通配符变量的SQL表联接,sql,Sql,我有两张相连的桌子。表1有客户端数据,表2有它们的状态 我需要一个通配符名称搜索,但我只希望它根据表2中的状态返回结果。当我在@ClientName变量中实际输入一些数据时,这种方法会起作用,但当该变量为空时,它会返回所有记录并忽略@ClientStatus变量。有没有办法解决这个问题 DECLARE @ClientName NVARCHAR (100) = '' DECLARE @ClientStatus INT = 1 SELECT DBO.CLIENTS.CLIENTID,
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 + '%' )
或的运算符优先级高于and,因此请将查询更改为以下内容:
WHERE ( DBO.CLIENT_STATUS.CLINIC_STATUS = @ClientStatus )
AND (( DBO.CLIENTS.LAST_NAME LIKE @ClientName + '%' )
OR ( DBO.CLIENTS.MOBILE_NUMBER LIKE @ClientName + '%' ))
首先,我猜您实际上想要对
或
条件进行分组,因为它的优先级高于和
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 '%' )
因为%
是一个通配符,所以您告诉它匹配任何内容。为了避免这种情况,您可能需要传入一个名称,或者以某种方式处理空/空输入