SQL Where子句和If(或Case)语句?
我有以下SQL语句: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
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)
谢谢你的快速回复!你完全正确!我想得太多了!(在这里写我的帖子实际上帮助我意识到了这一点!)你因为回答得最快而获得了荣誉!!再次感谢!谢谢你的快速回复!我现在明白了!