WHERE子句中的CASE表达式具有两个值

时间:2020-10-13 10:08:39

标签: sql sql-server

我正在尝试编写查询,以使用where子句具有大小写的条件从表中获取数据,但我需要在case语句中放入or,但是我找不到解决方案:

下面是我的查询

SELECT WFET.InstanceID,
       WFI.SomeID
FROM [SOME_Instance] WFI
     INNER JOIN [SomeTracker] WFET ON WFI.InstanceID = WFET.InstanceID
     INNER JOIN SOMEPROP_INSTANCE WFPI ON WFET.ItemID = WFPI.WIID
WHERE WFI.InstanceID NOT IN (SELECT WFTT.InstanceID
                             FROM [SomeTracker] WFTT
                                  INNER JOIN [dbo].[SomeItems_Instance] WFII ON WFII.ITemID = WFTT.ItemID
                                  INNER JOIN SomeActivities WFA ON WFII.ActivityType = WFA.ActivityTypeID
                             WHERE WFTT.Status IN (CASE WHEN WFA.ActivityType <> 'Conn' THEN ('Running','Pending') ELSE 'Pending' END))
  AND WFI.Status = 'Running'
  AND WFPI.PropertyType <> 'Last'
GROUP BY WFET.InstanceID,
         WFI.SomeID;

3 个答案:

答案 0 :(得分:1)

将子查询中的where子句改写为:

WHERE
     (WFA.ActivityType <> 'Conn' AND WFTT.Status IN ('Running','Pending')) OR
      WFA.ActivityType = 'Conn' AND WFTT.Status = 'Pending'

您使用CASE表达式是不正确的,因为它们必须生成单个标量值。 CASE表达式无法生成元组,但是我们仍然可以表达所需的逻辑。

完整代码:

WHERE WFI.InstanceID NOT IN (SELECT WFTT.InstanceID
                             FROM [SomeTracker] WFTT
                             INNER JOIN [dbo].[SomeItems_Instance] WFII
                                 ON WFII.ITemID = WFTT.ItemID
                             INNER JOIN SomeActivities WFA
                                 ON WFII.ActivityType = WFA.ActivityTypeID
                             WHERE
                                 WFA.ActivityType <> 'Conn' AND
                                 WFTT.Status IN ('Running','Pending') OR
                                 WFA.ActivityType = 'Conn' AND
                                 WFTT.Status = 'Pending')

答案 1 :(得分:1)

您可以将where逻辑简化为:

WHERE WFTT.Status = 'Pending' OR
      (WFA.ActivityType <> 'Conn' AND WFIT.Status = 'Running')

答案 2 :(得分:0)

CASE表达式根据布尔表达式返回一个值。它不能返回一个元组。而且我们通常不会在CASE子句中使用WHERE,因为WHERE子句本身会生成一个布尔值。我们使用ANDOR来描述所需的限制。

您的表情

WHERE WFTT.Status IN (CASE WHEN WFA.ActivityType <> 'Conn'
                           THEN ('Running','Pending') ELSE 'Pending' END))

将被写为

WHERE WFTT.Status = 'Pending'
   OR (WFA.ActivityType <> 'Conn' AND WFTT.Status = 'Running')
相关问题