SQL Where子句和If(或Case)语句?

SQL Where子句和If(或Case)语句?,sql,tsql,Sql,Tsql,我有以下SQL语句: SELECT WORKORDER.WONUM, WORKORDER.WO3, WORKORDER.DESCRIPTION WO_DESC, WORKORDER.WORKTYPE, WORKORDER.STATUS, WORKORDER.WOPRIORITY, (case when WORKORDER.CUSTREQ1=1 then 'Yes' else 'No' end) WO18, WORKOR

我有以下SQL语句:

SELECT 
    WORKORDER.WONUM,
    WORKORDER.WO3, 
    WORKORDER.DESCRIPTION WO_DESC, 
    WORKORDER.WORKTYPE, 
    WORKORDER.STATUS, 
    WORKORDER.WOPRIORITY, 
    (case when WORKORDER.CUSTREQ1=1 then 'Yes' else 'No' end) WO18, 
    WORKORDER.REPORTDATE, 
    WORKORDER.ACTFINISH, 
    (WORKORDER.LOCATION + ' ' +LOCATIONS.DESCRIPTION) LOC_DESC
FROM WORKORDER 
    LEFT OUTER JOIN LOCATIONS ON WORKORDER.LOCATION = LOCATIONS.LOCATION 
WHERE 
    WORKORDER.HISTORYFLAG = 0 
    AND WORKORDER.ISTASK = 0 
    AND WORKORDER.STATUS = 'COMP' 
    AND WORKORDER.STATUSDATE >= getdate() - 1 
    AND WORKORDER.LOCATION LIKE 'ABC%'
我想添加一个附加条件(可能在WHERE子句中)来启用以下行为:
-如果工作订单工作类型为“PM”,且工作优先级为5,则不要将其包括在内
-如果workorder工作类型是其他类型,则允许任何优先级

我不确定在WHERE条款中加入哪种类型的IF或CASE语句来具体限制下午5点的优先级。非常感谢您的任何帮助!提前谢谢


我可能已经找到了解决办法!我在WHERE条款末尾添加了以下行:

AND (case when WORKORDER.WORKTYPE='PM' then WORKORDER.WOPRIORITY<>5)
和(WORKORDER.WORKTYPE='PM'然后WORKORDER.WOPRIORITY5时的情况)

我想你可能想得太多了

WHERE NOT (WorkType = 'PM' AND WOPRIORITY = 5)

通常我会这样做:

 ... AND 1 = CASE WHEN WORKTYPE='PM' AND WOPRIORITY=5 THEN 0 ELSE 1 END ...

虽然在这种情况下,我不明白为什么不使用更简单的逻辑。一般来说,这样的CASE构造有助于在一般的布尔表达式中绕过SQL模糊的求值顺序。因为避免对空属性进行测试是很好的,而且布尔求值顺序没有很好的定义,所以您可以使用CASE来引入明确的操作顺序。

不仅仅是
WHERE not(WORKTYPE='PM'和WOPRIORITY=5)
可以解决您的问题吗?

您可以将这一行添加到WHERE子句中:

    AND NOT (WORKORDER.WORKTYPE = 'PM' AND WORKORDER.WOPRIORITY = 5)

谢谢你的快速回复!你完全正确!我想得太多了!(在这里写我的帖子实际上帮助我意识到了这一点!)你因为回答得最快而获得了荣誉!!再次感谢!谢谢你的快速回复!我现在明白了!