2017-04-13 204 views
0

我困在存储过程中的一个复杂的SQL开关案例语句中。复杂开关案例SQL

我复制存储过程的中间环节:

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来代替突出显示的部分。

请协助。

+1

你没有解释你的问题。请澄清你有什么问题。 – Mikuana

+0

@Mikuana:应用正确的案例。 必须用上述语句替换xxxxxxxxxxxxxx,该语句返回true或false –

+0

您能否提供[MCVE](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an- MCVE换什么,似乎对我将要-A-极简单的SQL查询)?没有样本数据和预期的结果来测试,这种问题可能很难回答。 –

回答

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)) 
    ) 
) 
+0

它给我的语法错误。 我编辑了我的问题。请看看它。 –

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)  
    ) 
+0

这是逻辑的一部分,不能忽视 –

+0

但它是无用的。这个select count(*)总是返回一个值.right?例如1-2-3-0任何事情都可以通过1 =(0 || 1或其他)进行比较 – Mehr

+0

您能否看到更新后的问题。 我必须更新if和else条件中突出显示的部分 –