我正在尝试使用条件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
答案 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)