我正在尝试编写查询,以使用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;
答案 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
子句本身会生成一个布尔值。我们使用AND
和OR
来描述所需的限制。
您的表情
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')