2013-10-30 32 views
0

我很難用this where子句獲得正確的結果。我知道這是一個paraenthesis問題。有什麼建議麼?在where子句中使用AND和OR

WHERE a.EVENT_DATE Between &trend_dt And &enddate 
AND a.INDICATOR Not In ('INQUIRY (NOS)','PCC') 
And a.INDICATOR2 Not In ('CAT-NA','INQUIRY (NOS)') 
And d.ACTIVE In ('C','F') 
And d.ARCHIVE_STATUS in ('N','Y') 
Or (d.ARCHIVE_STATUS Is Null) 

謝謝!

結果的問題是Indicator 2字段有時是空的,它只是在指示符2字段中有某些內容返回記錄。

這是查詢:

PROC SQL; 
CREATE TABLE COMPLAINT_DATA_0 as 
SELECT 
a.EVENT_DATE, 
a.INDICATOR, 
a.INDICATOR2, 
a.COMMITTEE_ACTION AS REVIEW_TYPE, 
a.LEVEL_OF_EXCEPTION AS METHOD_RECD, 
a.REFER_TO AS PLAN_NTWK, 
b.DESCRIPTION AS SubCategory, 
d.CROSSREF2 AS ConProvID, 
d.LAST_NAME AS Provider, 
a.MED_REC_NO AS MbrID, 
a.CONFIRMED_BY AS IndProvID, 
a.CODE_15 AS Severity, 
MAX(c.INQUIRY_BODY) AS MaxProcStep, 
e.Notes, 
e.Notes2, 
FROM VIPDBA.QA_PEER AS a LEFT JOIN VIPDBA.SYS_LOOKUPS AS b 
ON a.INDICATOR2=b.CODE 
LEFT JOIN VIPDBA.QA_PEER_INQUIRY AS c 
    ON a.LOOKUP_KEY=c.LOOKUP_KEY AND 
a.MED_REC_NO=c.MED_REC_NO 
LEFT JOIN VIPDBA.MASTER_CRED AS d 
    ON a.LOOKUP_KEY=d.LOOKUP_KEY 
LEFT JOIN Complaint_Notes AS e 
    ON a.LOOKUP_KEY=e.LOOKUP_KEY AND 
a.MED_REC_NO=e.MbrID 
WHERE a.EVENT_DATE Between &trend_dt And &enddate 
    AND a.INDICATOR Not In ('INQUIRY (NOS)','PCC') 
    And a.INDICATOR2 Not In ('CAT-NA','INQUIRY (NOS)') 
    And d.ACTIVE In ('C','F') 
    And 
     (d.ARCHIVE_STATUS IN ('N','Y') 
     OR d.ARCHIVE_STATUS is null) 
GROUP a.EVENT_DATE, 
a.INDICATOR, 
a.INDICATOR2, 
b.DESCRIPTION, 
d.CROSSREF2, 
d.LAST_NAME, 
a.MED_REC_NO, 
a.CONFIRMED_BY, 
a.CODE_15, 
e.Notes, 
e.Notes2, 
d.archive_status, 
d.active 
ORDER BY 
a.EVENT_DATE, 
a.INDICATOR2, 
b.DESCRIPTION, 
d.CROSSREF2, 
d.LAST_NAME 

; 跑;

+1

一些指導,你做了什麼你期待什麼可能會有所幫助。 –

+0

在此之前你有一些左連接? –

+0

歡迎來到SO。你期待什麼輸出?也可以粘貼整個查詢 – JNL

回答

2

我認爲你正在尋找這樣的:

WHERE a.EVENT_DATE Between &trend_dt And &enddate 
AND a.INDICATOR Not In ('INQUIRY (NOS)','PCC') 
And a.INDICATOR2 Not In ('CAT-NA','INQUIRY (NOS)') 
And d.ACTIVE In ('C','F') 
And (d.ARCHIVE_STATUS in ('N','Y') Or d.ARCHIVE_STATUS Is Null) 

使用圓括號組邏輯在一起。

0

是否需要查看結果:d.ARCHIVE_STATUS('N','Y') 或(d.ARCHIVE_STATUS爲空)如果是,則可能只需將其更改爲如下所示

WHERE a.EVENT_DATE Between &trend_dt And &enddate 
AND a.INDICATOR Not In ('INQUIRY (NOS)','PCC') 
And a.INDICATOR2 Not In ('CAT-NA','INQUIRY (NOS)') 
And d.ACTIVE In ('C','F') 
And (
     d.ARCHIVE_STATUS in ('N','Y') 
     Or 
     d.ARCHIVE_STATUS Is Null 
    ) 

這樣,它只能在評估d.ARCHIVE_STATUS( 'N', 'Y')相對於d.ARCHIVE_STATUS IS NULL

2

甲特技避免檢查換NULL(和從而避免了需要OR ...)將NULL轉換爲可比值,如:

WHERE a.EVENT_DATE BETWEEN &trend_dt AND &enddate 
AND a.INDICATOR NOT IN ('INQUIRY (NOS)','PCC') 
AND a.INDICATOR2 NOT IN ('CAT-NA','INQUIRY (NOS)') 
AND d.ACTIVE IN ('C','F') 
AND COALESCE(d.ARCHIVE_STATUS, 'N') IN ('N','Y') 
    ; 
+1

這仍然會破壞在archive_status列上使用索引的能力,但它比OR條件稍好一些 –

2

或者你甚至能避免使用OR :)

WHERE a.EVENT_DATE Between &trend_dt And &enddate 
AND a.INDICATOR Not In ('INQUIRY (NOS)','PCC') 
And a.INDICATOR2 Not In ('CAT-NA','INQUIRY (NOS)') 
And d.ACTIVE In ('C','F') 
And COALESCE(d.ARCHIVE_STATUS,'-1') in ('N','Y','-1')