2015-10-16 62 views
0

我正在寻找where子句中使用变量的case语句的一个很好的示例。变量返回的数字决定了where子句的结果。我的查询是这样的:在where子句中使用CASE - 使用参数

IF   @RequestType = 99 
    SELECT @Received = count(*) 
    FROM Request r 
    WHERE request_received_date between @beginDate and @endDate 
    AND  request_type_id <> 5 
    ELSE IF @RequestType = 100 
BEGIN 
    SELECT @Received = count(*) 
    FROM Request r 
    WHERE request_received_date between @beginDate and @endDate 
END 
    ELSE 
BEGIN 
    SELECT @Received = count(*) 
    FROM Request r 
    WHERE request_received_date between @beginDate and @endDate 
    AND  request_type_id = 
      (CASE WHEN @RequestType = 1 THEN (1) 
      WHEN @RequestType = 2 THEN (2) 
      WHEN @RequestType = 3 THEN (3) 
      WHEN @RequestType = 4 THEN (4) 
      WHEN @RequestType = 5 THEN (5) 
      END) 
END 

因此,大家可以看到,有7个选项 - 客户愿意与他们在报告中看到的数据量灵活。这看起来很麻烦,但我想不出有任何其他的方式来做到这一点。

+1

请编辑您的问题以包括SQL的版本作为其中一个标记。 – Dijkgraaf

+6

该病例陈述的要点是什么?为什么不只是:'request_type_id = @ RequestType' –

回答

0

你很可能简化查询到...

SELECT 
     count(*) as Received 
    FROM 
     (select 3 as RqType, 
       '2015-10-01' as beginDate, 
       '2015-10-20' as endDate) as PV, 
     Request r 
    WHERE 
      request_received_date between PV.beginDate and PV.endDate 
     AND case when PV.RqType = 100 then 1=1 
       when PV.RqType = 99 then r.request_type_id <> 5 
       when PV.RqType <= 6 then PV.RqType = r.request_type_id 
      end 

最后一种情况/当组件请求类型匹配越来越6下的值,以匹配该请求的类型。如果你有否定的话,那就调整一下。

我修改了查询以使预查询“PV”指示您正在查找的参数值,因此只需根据需要将它们更改为任何请求类型和日期范围即可。这对于SQL-Server应该是很好的,也可能是其他的SQL引擎。通过只查询没有“FROM”的硬值,它本质上创建了一个单一记录的结果集,然后可以将这些值用于查询的其余部分。任何一个记录都不会成为任何笛卡尔连接的问题。

+0

我正在拍这个时刻的额头。谢谢你的推动;) – Ringl

+0

@Ringl,很高兴你还没有把前额弄平:)...另外,如果有效,请确保标记为已解决,以便其他人也知道...还可以退房HELP - > TOUR为现场礼节。欢迎来到论坛。 – DRapp

+0

这是mysql语法吗? sql server版本的外观如何? – Ringl

0

在WHERE子句中,通常不需要CASE WHEN,因为您有AND和OR。您的查询转换为:

select @Received = count(*) 
from request 
where request_received_date between @beginDate and @endDate 
and 
(
    @RequestType = 100 
    or 
    (@RequestType = 99 and request_type_id <> 5) 
    or 
    (@RequestType = request_type_id and request_type_id in (1,2,3,4,5)) 
);