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我肯定会访问您的网站。