2011-03-02 185 views
2

我有以下SQL语句:SQL If(或Case)语句的where子句?

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子句大概),这将使以下行为:
- 如果工作单WORKTYPE是“PM”和WOPRIORITY是5,不包括它!
- 如果工作单WORKTYPE为别的,允许任何优先

我不知道究竟把WHERE子句specfically限制优先下午5点在什么类型的IF或CASE语句。任何和所有的帮助,非常感谢!提前致谢!


我可能找到了解决方案!我已经添加了以下行WHERE子句的末尾:

AND (case when WORKORDER.WORKTYPE='PM' then WORKORDER.WOPRIORITY<>5) 

回答

2

我想你可能会想得好好的,这......

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

感谢您的快速反应!你完全正确!我正在推翻它! (写我的帖子实际上帮助我意识到了这一点!) – 2011-03-02 16:30:57

+0

你得到了答案,因为你回答最快!再次感谢! – 2011-03-02 17:41:17

0

通常我做这样的事情:

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

虽然在这种情况下,我不明白为什么你不会只使用更简单的逻辑。通常情况下,像这样的CASE结构很适合在一般的布尔表达式中绕过SQL的错误评估顺序。因为避免对空属性进行测试是很好的做法,并且由于布尔评估顺序没有很好地定义,所以可以使用CASE来引入明确的操作顺序。

2

会不会只是WHERE NOT (WORKTYPE = 'PM' AND WOPRIORITY = 5)解决你的问题?

+0

感谢您的快速回复!我得到它的工作! – 2011-03-02 16:31:34

2

您可以将此行添加到您的where子句:

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

感谢您的快速回复!我现在明白了! – 2011-03-02 16:31:13