SQL:条件 AND 在 where

SQL: Conditional AND in where(SQL:条件 AND 在 where)
本文介绍了SQL:条件 AND 在 where的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

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

I'm trying to create a stored procedure that allows parameters to be omitted, but ANDed if they are provided:

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)

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

I only want to do the AND if there's an @SSN provided. Or is there some other way to do this?

如果提供了 SSN,则所有记录都由查询的姓氏/名字部分返回.如果只提供了姓氏/名字,则 AND 将使其成为这样,因此不会返回任何记录,因为 SSN 不会验证.

If an SSN is provided, all records are returned by the LastName/FirstName part of the query. If just a lastname/firstname is provided, the AND makes it so no records are returned since the SSN won't validate.

想法?

补充说明

假设有一个基本记录集:

Assume a basic recordset:

First          Last          SSN  
Mike           Smith         123456789  
Tom            Jones         987654321

如果我们改变上面的程序,使它不包括这个块:

IF we ALTER the Procedure above so it doesn't include this chunk:

AND
    (SSN = @SSN)

然后一切正常,只要我们传递了名字或姓氏.但我希望能够包括 SSN,如果提供的话.

then everything works great, provided we're passed a FirstName or LastName. But I want to be able to include SSN, if one is provided.

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

If I change the AND to an OR, then I get a bad result set since the FirstName/LastName portion of the query evalute to:

WHERE (LastName like '%%' and FirstName like '%%')

(当然会返回所有记录)

(which will, of course, return all records)

如果我不能有条件地中止 AND,我希望是这样的:

If I can't conditionally abort the AND, I'm hoping for something like:

AND
    (SSN like ISNULL(@SSN, '%'))

:-)

推荐答案

更改:

AND (SSN = @SSN) 

到:

AND (SSN = @SSN or @SSN is null)

如果 SSN 从不为空,你也可以这样做:

If SSN is never null, you could also do:

AND SSN = ISNULL(@SSN, SSN)

这篇关于SQL:条件 AND 在 where的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

ibtmp1是非压缩的innodb临时表的独立表空间,通过innodb_temp_data_file_path参数指定文件的路径,文件名和大小,默认配置为ibtmp1:12M:autoextend,也就是说在文件系统磁盘足够的情况下,这个文件大小是可以无限增长的。 为了避免ibtmp1文件无止境的暴涨导致
SQL query to group by day(按天分组的 SQL 查询)
What does SQL clause quot;GROUP BY 1quot; mean?(SQL 子句“GROUP BY 1是什么意思?意思是?)
MySQL groupwise MAX() returns unexpected results(MySQL groupwise MAX() 返回意外结果)
MySQL SELECT most frequent by group(MySQL SELECT 按组最频繁)
Include missing months in Group By query(在 Group By 查询中包含缺失的月份)