TSQL如何在Where子句中使用if-else
我想创建一个报告,该报告将有参数供用户选择TSQL如何在Where子句中使用if-else,sql,sql-server,Sql,Sql Server,我想创建一个报告,该报告将有参数供用户选择 -IsApprovedDate -IsCatcheDate 我想知道如何在where子句中使用if-else 示例如果用户选择IsApprovedDate,则报告将根据批准日期进行查找,否则将根据捕获日期进行查找。在我的查询中,我将根据奖励订单重量获得前10名鱼的大小。这里是我的查询 ;WITH CTE AS ( select Rank() OVER (PARTITION BY c.trophyCatchCertific
-IsApprovedDate
-IsCatcheDate
我想知道如何在where子句中使用if-else
示例如果用户选择IsApprovedDate,则报告将根据批准日期进行查找,否则将根据捕获日期进行查找。在我的查询中,我将根据奖励订单重量获得前10名鱼的大小。这里是我的查询
;WITH CTE AS
(
select Rank() OVER (PARTITION BY c.trophyCatchCertificateTypeId order by c.catchWeight desc ) as rnk
,c.id,c.customerId, Cust.firstName + ' '+Cust.lastName as CustomerName
,CAST(CONVERT(varchar(10),catchWeightPoundsComponent)+'.'+CONVERT(varchar(10),catchWeightOuncesComponent) as numeric(6,2) ) WLBS
,c.catchGirth,c.catchLength,ct.description county
,t.description award--
,c.trophyCatchCertificateTypeId
,s.specificSpecies--
,c.speciesId
from Catches c
INNER JOIN TrophyCatchCertificateTypes t on c.trophyCatchCertificateTypeId = t.id
INNER JOIN Species s on c.speciesId = s.id
INNER JOIN Counties ct on c.countyId = ct.id
INNER JOIN Customers Cust on c.customerId = cust.id
Where c.bigCatchCertificateTypeId is not null
and c.catchStatusId =1
and c.speciesId =1 and c.isTrophyCatch =1
and c.catchDate >= @startDay and c.catchDate<=@endDay
)
Select * from CTE c1
Where rnk <=10
只需使用条件逻辑即可:
where . . . and
((@IsApprovedDate = 1 and c.ApprovedDate >= @startDay and c.ApprovedDate <= @endDay) or
(@IsCatchDate = 1 and c.catchDate >= @startDay and c.catchDate <= @endDay)
)
编辑:
我实际上会这样写:
where . . . and
((@IsApprovedDate = 1 and c.ApprovedDate >= @startDay and c.ApprovedDate < dateadd(day, 1 @endDay) or
(@IsCatchDate = 1 and c.catchDate >= @startDay and c.catchDate < dateadd(day, 1, @endDay))
)
这是一个更安全的构造,因为它在日期值有时间和没有时间的情况下工作。如果在代码中动态构建WHERE子句,然后执行它,性能会更好。在SQL Server中,if..ELSE由CASE..when..then..ELSE语句完成。这就是你要找的吗?Caffe感谢你的链接,它非常有用。你也可以使用between来比较这两个日期,例如c.catchDate between@startDay和@endDay@Smog . . . 我不鼓励人们在约会时使用中间时间。当日期包含时间成分时,它往往会导致问题。您还可以将dateaddday、1、@endDay包含在中间clause@Smog . . . 请注意,谢谢大家的回答。非常感谢您的帮助,这为我节省了很多时间。同意您的意见,请访问此网站以更好地理解@qwerty12579回答谢谢您qwerty13579,Neeraj我肯定会访问您的网站。