在 WHERE 子句中使用可选参数 [英] use optional parameter in WHERE clause

查看:43
本文介绍了在 WHERE 子句中使用可选参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个SP

ALTER PROCEDURE dbo.sp_Compare
    @lst varchar(100),
    @frst varchar(100) = NULL,
    @passportNo varchar(50) = NULL
AS
SELECT * FROM dbo.User
WHERE LastName like '%' + @lst + '%'
    AND (
         FirstName like @frst + ' %'
         OR FirstName like '% ' + @frst + ' %'
         OR FirstName like '% ' + @frst
         OR FirstName = @frst
        )
    OR Passport = @passportNo;

有时@frs@passportNo 或两者的详细信息可能不可用

Sometimes @frs or @passportNo or both the details may not be available

所以我想更改上面的查询,以便在未传递可选参数时(即,当其值为空时)不应考虑对该特定列进行过滤

so I want to change the above query such that when optional parameter is not passed(ie., when its value is null) that parameter shouldn't be considered for filtering on that particular column

即,如果 @frst 为 NULL,则结果不应基于 FirstName 进行过滤,它应该像没有 FirstName 一样工作,如 '%' + @frst + 'WHERE 子句中的 %' 条件..

viz., if @frst is NULL then result shouldn't be filtered based in FirstName, it should work as if there was no FirstName like '%' + @frst + '%' condition in WHERE clause..

如何在不针对不同情况重复编写相同逻辑的情况下编写查询?

How can I write the query without writing the same logic repeatedly for different cases?

推荐答案

WHERE (@frst IS NULL OR 
    (
         LastName like '%' + @lst + '%'
         AND (
             FirstName like @frst + ' %'
             OR FirstName like '% ' + @frst + ' %'
             OR FirstName like '% ' + @frst
             OR FirstName = @frst
        )
    )
 )
 AND (@passportNo IS NULL OR
        Passport = @passportNo);

编辑:实际上这应该更有效:

Edit: Actually this should be more efficient:

WHERE ( @frst IS NULL OR FirstName like '%' + @frst + '%' )
AND   ( @lst  IS NULL OR LastName  like '%' + @lst  + '%' )
AND   ( @passportNo IS NULL OR Passport = @passportNo )

这篇关于在 WHERE 子句中使用可选参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆