2011-03-02 301 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