条件where子句使用非NULL参数

时间:2014-06-09 08:31:05

标签: sql sql-server sql-server-2005

我正在尝试使用条件where子句编写脚本。非常喜欢这个。这可以吗? 这是一个存储过程,将由vb.net应用程序调用,@ Model类的值将确定要在where子句中使用的参数。我会在必要时将dbnull值传递给未使用的参数。

CREATE PROCEDURE [dbo].[newNBOCAP_DATA_UPDATE]
@StartDate datetime,
@EndDate datetime,
@ReferralID integer,
@ModeType varchar (50)

select * from tableA
where
case
when @ModeType = 'proforma' and @ReferralID IS NOT NULL
then referral = @ReferralID
when @ModeType = 'download' and ISDATE(@StartDate) = 1 and ISDATE(@EndDate) = 1
then startdate = @StartDate and enddate = @EndDate
end

1 个答案:

答案 0 :(得分:4)

人们似乎总是急于尝试使用CASE,而实际上他们所需要的只是基本的布尔逻辑:

select * from tableA
where
(@ModeType = 'proforma' and @ReferralID IS NOT NULL and referral =@ReferralID) or
(@ModeType = 'download' and ISDATE(@StartDate) = 1 and ISDATE(@EndDate) = 1 and
    startdate = @StartDate and enddate = @EndDate)

当然,如果referral =@ReferralID 为空,@ReferralID永远不会成为真,除非ANSI_NULLS关闭not recommended。此外,声明为datetime的变量只能是有效日期或NULL,因此我们可以进一步简化为:

select * from tableA
where
(@ModeType = 'proforma' and referral =@ReferralID) or
(@ModeType = 'download' and startdate = @StartDate and enddate = @EndDate)