如何在Where子句SQL中使用IF语句或案例

时间:2011-09-23 03:06:01

标签: sql stored-procedures

请帮忙,如何在If条款中插入CaseWhere

这是我的代码的一部分,但是我收到了错误,但我插入IfCase When

这是错误消息156,级别15,状态1,过程p5,行35

  

关键字'BETWEEN'

附近的语法不正确
AS 
WITH 
    t1 AS (SELECT 0 n UNION ALL SELECT 0 n UNION ALL SELECT 0 UNION ALL SELECT 0)
    ,Calendario AS (SELECT DATEADD(day, (ROW_NUMBER() OVER (ORDER BY a.n)), @CheckIn) AS Fetcha
        FROM t1 a, t1 b, t1 c, t1 d, t1 e, t1 f)    


SELECT @noches= convert(int,@Checkout - @CheckIn), @Sum = SUM(dbl*@canthabdbl),@SumSGL = SUM(SGL*@canthabsgl), @SumTPL = SUM(isnull(Triple,0)*@canthabtpl),@SumCUAD = SUM(isnull(Cuad,0)*@canthabcdpl),@SumChd = SUM(isnull(Chd,0)*@cantchd), @totalhab = (@Sum+@SumSGL+@SumTPL+@SumCUAD+@SumChd), @average = (@totalhab/@noches)  
FROM hotelsnew 
JOIN Calendario ON  
Calendario.Fetcha BETWEEN Desde AND Hasta+1

WHERE 
    CASE WHEN @checkout>hasta THEN  
    Calendario.Fetcha BETWEEN @CheckIn+1 AND @CheckOut-1  
    AND Hoteles = @IDHotel AND tipohabitacion = @IDTipo AND Id_plan = @IDPlan 
    ELSE 
    Calendario.Fetcha BETWEEN @CheckIn AND @CheckOut  
    AND Hoteles = @IDHotel AND tipohabitacion = @IDTipo AND Id_plan = @IDPlan
    END  

RETURN 

3 个答案:

答案 0 :(得分:2)

未经测试的猜测。看看是否有效。

WHERE 
(
   @checkout>hasta AND
   Calendario.Fetcha BETWEEN @CheckIn+1 AND @CheckOut-1 AND  
   Hoteles = @IDHotel AND tipohabitacion = @IDTipo AND Id_plan = @IDPlan 
) OR 
(
   @checkout <= hasta AND
   Calendario.Fetcha BETWEEN @CheckIn AND @CheckOut AND 
   Hoteles = @IDHotel AND tipohabitacion = @IDTipo AND Id_plan = @IDPlan
)

答案 1 :(得分:2)

试试这个:

WHERE Calendario.Fetcha BETWEEN
    CASE WHEN @checkout>hasta THEN @CheckIn+1 ELSE @CheckIn END
    AND
    CASE WHEN @checkout>hasta THEN @CheckOut-1 ELSE @CheckOut END
    AND Hoteles = @IDHotel AND tipohabitacion = @IDTipo AND Id_plan = @IDPlan

答案 2 :(得分:1)

CASE语句通常包含在选择部分中,如下所示:

SELECT 
  CASE ContactType WHEN 'Person' THEN LastName ELSE BusinessName END
FROM Contacts

对于你的WHERE子句,我建议将其重写为:

WHERE 
    (@checkout>hasta AND Calendario.Fetcha BETWEEN @CheckIn+1 AND @CheckOut-1  
    AND Hoteles = @IDHotel AND tipohabitacion = @IDTipo AND Id_plan = @IDPlan)
    OR 
    (@checkout<=hasta AND Calendario.Fetcha BETWEEN @CheckIn AND @CheckOut  
    AND Hoteles = @IDHotel AND tipohabitacion = @IDTipo AND Id_plan = @IDPlan)