SQL哪里有If(或Case)语句的子句?

时间:2011-03-02 16:25:19

标签: 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, 
    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子句中放入什么类型的IF或CASE语句来明确限制优先级5 PM。非常感谢任何和所有的帮助!提前谢谢!


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

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

4 个答案:

答案 0 :(得分:2)

我认为你可能会对此过于考虑......

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

答案 1 :(得分:2)

不会WHERE NOT (WORKTYPE = 'PM' AND WOPRIORITY = 5)解决您的问题吗?

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

通常我会做这样的事情:

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

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