2014-09-02 81 views
0

我試圖在一個包含多個選項的單個SQL腳本中獲得結果。終於得到了我需要的結果。SQL Server WHERE子句 - 建議

where 
(RTRIM(FMLS.REGION)) IN (@Region) and 
(RTRIM(FMB0.COUNTRY))IN (@Country) and 
(RTRIM(FMB0.SITECODE)) IN (@Site) and 
(RTRIM(FMB0.BLDGCODE)) IN (@Building) and 
( 
( 
    (RTRIM(FMA0.SPACETYPE) NOT IN ('A-OFF-AS','A-WKS-AS') AND ((RTRIM(FMA0.SPCODE) <> '') AND (FMA0.SPCODE IS NOT NULL))) 
      AND 
    (RTRIM(FMA0.SPACETYPE) NOT LIKE 'CR-%' AND ((RTRIM(FMA0.SPCODE) <> '') AND (FMA0.SPCODE IS NOT NULL))) 
) 
OR 
( 
    (RTRIM(FMA0.SPACETYPE) = 'A-OFF-AS' AND RTRIM(FMA0.SPCODE) NOT LIKE 'A-OFF-%') OR 
    (RTRIM(FMA0.SPACETYPE) = 'A-WKS-AS' AND RTRIM(FMA0.SPCODE) NOT LIKE 'A-WKS-%')OR 
    (RTRIM(FMA0.SPACETYPE) LIKE 'CR-%' AND RTRIM(FMA0.SPCODE) NOT LIKE 'CR-%') 
) 
) 

但是我擔心的是用於在這些兩行

(RTRIM(FMA0.SPACETYPE) NOT IN ('A-OFF-AS','A-WKS-AS') AND ((RTRIM(FMA0.SPCODE) <> '') AND (FMA0.SPCODE IS NOT NULL))) 
      AND 
    (RTRIM(FMA0.SPACETYPE) NOT LIKE 'CR-%' AND ((RTRIM(FMA0.SPCODE) <> '') AND (FMA0.SPCODE IS NOT NULL))) 

,我還以爲它應該是一個OR,因爲我想要得到的結果,其中FMA0.SPCODE是空白的需要對於兩條線都是空的,像這樣

(RTRIM(FMA0.SPACETYPE) NOT IN ('A-OFF-AS','A-WKS-AS') AND ((RTRIM(FMA0.SPCODE) <> '') OR (FMA0.SPCODE IS NOT NULL))) 
      OR 
    (RTRIM(FMA0.SPACETYPE) NOT LIKE 'CR-%' AND ((RTRIM(FMA0.SPCODE) <> '') OR (FMA0.SPCODE IS NOT NULL))) 

但是,如果我這樣做,我會得到錯誤的結果。我無法弄清楚,也許一直在看這個太長,或者在錯誤的地方有括號,但我看不到我做錯了什麼.....請幫助,它讓我生氣!

回答

0

ANDOR帶有負面表情在邏輯上有點複雜。如果你說:

SPACETYPE NOT IN ('A-OFF-AS','A-WKS-AS') OR SPACETYPE NOT LIKE 'CR-%' 

然後所有SPACETYPE將通過這項測試。考慮一個值,如'THIS',它不在第一個列表中,所以它可以。考慮一個值,如'A-OFF-AS'。它在第一個列表中,所以第一個條件失敗。所以,去第二個條件。沒有匹配,所以它通過。你可以嘗試很多不同的值,你會發現OR會通過一切。事實上,上面的邏輯等價於:

NOT (SPACETYPE IN ('A-OFF-AS','A-WKS-AS') AND SPACETYPE LIKE 'CR-%') 

顯然AND是不正確的,所以NOT是假的。 (注意:這個討論忽略了NULL的值。)

因此,OR不起作用。高興地爲你,AND確實做你想做的。你只需要習慣布爾邏輯的複雜性。