复杂的开关案例SQL

时间:2017-04-13 11:33:17

标签: sql sql-server case

我在存储过程中遇到了复杂的SQL switch case语句。

我正在复制存储过程的中间部分:

AND 
( 
  @Statuses IS NULL 
  OR 
  [BF].[BookingFileStatusID] IN 
  ( 
         SELECT [ID] 
         FROM   @BookingFileStatuses) 
  AND 
  ( 
    @Statuses IS NULL 
    OR 
    **(( 
    ( 
           SELECT count([ID]) 
           FROM   @BookingFileStatuses) >= 1) 
    AND 
    ( 
      1 = ( 
      CASE 
      WHEN [S].servicetypeid IS NULL THEN 1 
      WHEN ( 
          [S].servicetypeid <> 3 
          AND 
          [BF].bookingfilestatusid IN ( 16, 17, 18, 19, 20, 23) 
        ) 
        THEN 1 
      WHEN ( 
          [S].servicetypeid = 3 
          AND 
          [BF].bookingfilestatusid IN 
          ( 
                 SELECT [ID] 
                 FROM   @BookingStatuses) 
        ) 
        THEN 1 
        ELSE 0 
      END) 
    ) 
    )** 
  ) 
)

突出显示的部分应返回一些结果。

即。用if else替换突出显示的部分。

请协助。

2 个答案:

答案 0 :(得分:0)

你可以在没有case语句的情况下重写整个事情。这种方式更容易阅读。

(
     (SELECT Count([ID]) FROM @BookingFileStatuses) >= 1
AND 
   (     [S].ServiceTypeID IS  NULL 
      OR  ([S].ServiceTypeID <> 3 AND [BF].BookingFileStatusID in (16,17,18,19,20,23)) 
      OR  ([S].ServiceTypeID = 3 AND [BF].BookingFileStatusID in (SELECT [ID] FROM @BookingStatuses)) 
   )
)

答案 1 :(得分:0)

在这部分:

 AND ( @Statuses IS NULL 
    OR  
    1 = (CASE WHEN @BookingStatusCount = 0  THEN 1                      

    ELSE 
    xxxxxxxxxxxxxxxx
    END)    

)

你正在制作或有两种情况:1 =(1或其他)。所以你根本不需要第二个查询。因为你总能创造一个价值。我想写一下:

 AND ( @Statuses IS NULL 
        OR  
       1 = (CASE WHEN @BookingStatusCount = 0  THEN 1  else 5)    
     )