SQL:条件AND在哪里

Rus*_*tte 5 sql sql-server where

我正在尝试创建一个存储过程,允许省略参数,但如果提供了参数,则为AND:

CREATE PROCEDURE 
    MyProcedure

    @LastName Varchar(30) = NULL,
    @FirstName Varchar(30) = NULL,
    @SSN INT = NULL
AS

SELECT LastName, FirstName, RIGHT(SSN,4) as SSN
FROM Employees
WHERE 
    (
        (LastName like '%' + ISNULL(@LastName, '') + '%')
            AND 
        (FirstName like '%' + ISNULL(@FirstName, '') + '%')
    )
AND
    (SSN = @SSN)
Run Code Online (Sandbox Code Playgroud)

如果提供了@SSN,我只想做AND.或者还有其他方法可以做到这一点吗?

如果提供了SSN,则查询的LastName/FirstName部分将返回所有记录.如果只提供了姓氏/名字,那么AND会使它不会返回任何记录,因为SSN不会验证.

想法?


额外的澄清

假设一个基本记录集:

First          Last          SSN  
Mike           Smith         123456789  
Tom            Jones         987654321
Run Code Online (Sandbox Code Playgroud)

如果我们改变上面的过程,那么它不包括这个块:

AND
    (SSN = @SSN)
Run Code Online (Sandbox Code Playgroud)

如果我们传递了FirstName或LastName,那么一切都很好.但我希望能够包含SSN,如果有的话.

如果我将AND更改为OR,那么我得到一个错误的结果集,因为查询的FirstName/LastName部分evalute为:

WHERE (LastName like '%%' and FirstName like '%%')
Run Code Online (Sandbox Code Playgroud)

(当然,这将返回所有记录)


如果我不能有条件地中止AND,我希望有类似的东西:

AND
    (SSN like ISNULL(@SSN, '%'))
Run Code Online (Sandbox Code Playgroud)

:-)

Red*_*ter 13

更改:

AND (SSN = @SSN) 
Run Code Online (Sandbox Code Playgroud)

至:

AND (SSN = @SSN or @SSN is null)
Run Code Online (Sandbox Code Playgroud)

如果SSN永远不为null,您还可以:

AND SSN = ISNULL(@SSN, SSN)
Run Code Online (Sandbox Code Playgroud)