2015-06-25 151 views
-3

以下2個代碼有什麼區別,我在輸出中有很大的區別。之間的區別不在和<>或<>

1)

SUM( 
CASE 
WHEN lientype.id NOT IN (-1, -3) THEN 
    ((a.floatingspread + dbo.maxfloat(a.floatingspreadfloor, al.liborrate)) * pos.marketvalue) 
    ELSE 0 
END)/NULLIF(sum( 
CASE 
WHEN lientype.id NOT IN (-1, 
         -3) THEN 
    (pos.marketvalue) 
    ELSE 0 
END),0) averagecoupon 

2)

SUM( 
CASE 
WHEN ( 
    lientype.id<>-1 
    OR 
    lientype.id<>-3 
) 
    THEN 
    ((a.floatingspread + dbo.maxfloat(a.floatingspreadfloor, al.liborrate)) * pos.marketvalue) 
    ELSE 0 
END)/NULLIF(sum( 
CASE 
WHEN ( 
    lientype.id<>-1 
    OR 
    lientype.id<>-3 
) 
    THEN 
    (pos.marketvalue) 
    ELSE 0 
END),0) averagecoupon 
+3

你應該有「和」,而不是「或」 <> -1 < > -3總是對的 –

+2

對您的問題的簡單回答是「是」。錯誤的答案?壞問題。 –

+2

如果輸出有很大的差異,那麼是的,你可以推斷有差異。 – Jodrell

回答

0

當A和B不相等本身,所有的值都是

不等於A

不等於B.

就像在說:「給我所有不是-1的東西,而不是所有不是-3。」這與一切都一樣。

這是一個可以省略的毫無意義的檢查。

凡爲,NOT IN (A, B)

等同於一切,但A或B.

在你的片段,你可以次優寫,

WHEN NOT (lientype.id = -1 OR lientype.id = -3) 

一個直接的邏輯替代
WHEN lientype.id NOT IN (-1, -3) 
2

NOT IN給你r案件應該轉化爲<> -1 AND <> -3。由於<> -1 OR <> -3粗略地翻譯成NOT IN (-1) OR NOT IN (-3),所以輸出將會非常不同。

+0

@ user5016908 - 如果它解決了您的問題,請隨時註冊一個答案,如果它幫助您並接受它。這有助於他人知道哪些答案可能有所幫助,並且是否解決了您的問題。它也增加了你的聲譽。 –

1

此:

lientype.id<>-1 
OR 
lientype.id<>-3 

應該是:

lientype.id<>-1 
AND 
lientype.id<>-3 

以相當於:

lientype.id NOT IN (-1, -3) 

你現在正在做的是隻是說lientype.id is not -1 or it is not -3,但它很顯然它不能同時等於兩個值,所以它總是會是true

0

表達:

lientype.id NOT IN (-1, -3) 

相當於:

NOT (lientype.id = -1 OR lientype.id = -3) 

這也等價於:

lientype.id != -1 AND lientype.id != -3 

lientype.id <> -1 AND lientype.id <> -3 

當您在括號內「分配」NOT時,您需要將任何布爾邏輯和比較運算符「翻轉」在一起(AND -> OR,OR -> AND,= -> !=!= -> =)。您已顛倒了相等運算符(= -> <>),但不是布爾型OR

+0

只需要添加 - 'id NOT IN(-1,-3)'AND'(id!= -1 AND id!= -3)'是絕對等價的,並且將被查詢優化器相同地處理,這將產生兩者的執行計劃相同,所以最好使用'NOT IN'語法,因爲它更清晰。 –

0

遲到了,但你仍然可以使用OR但需要使用=和切換THENEND

SELECT 
SUM(CASE 
    WHEN ( 
     lientype.id=-1 
     OR 
     lientype.id=-3 
    ) 
    THEN 0 
    ELSE ((a.floatingspread + dbo.maxfloat(a.floatingspreadfloor, al.liborrate)) * pos.marketvalue) 
    END) 
/NULLIF(SUM( 
    CASE 
    WHEN ( 
     lientype.id=-1 
     OR 
     lientype.id=-3 
     ) 
    THEN 0 
    ELSE 
     (pos.marketvalue) 
    END),0) averagecoupon -- DIVIDE BY ZERO? 
相關問題