2017-05-24 51 views
0

我有一個SQL查詢這確實是這樣的:SQL NOT運算符不工作

SELECT 
    IIF (
     col1 = 'A' OR 
     col2 = 'B' OR 
     col3 = 'C' 
    , 'true', 'false') TEST1, -- test some conditions 
    IIF (
     NOT (
      col1 = 'A' OR 
      col2 = 'B' OR 
      col3 = 'C' 
     ) 
    , 'true', 'false') TEST2 -- same as TEST1, but wrap NOT operator around it 
FROM 
    -- some tables and conditions 

兩列TEST1和TEST2應該是對立的,但TEST2永遠是假的。任何想法爲什麼?

+0

你的第二隻吐出TRUE;當'col1'不等於'A'和'col2'不等於'B'和'COL3 '不等於'C'。嘗試將它們的值全部設置爲'D'並運行。本質上,如果在NOT()中的任何一個測試返回TRUE,則NOT()將把TRUE改爲FALSE。所以他們必須都是'FALSE'來返回一個'TRUE'。 – JNevill

回答

0

,想到的唯一的事情是這樣的:

 
col1 col2 col3 
'D' 'E'  

這裏col1 = 'A' OR col2 = 'B' OR col3 = 'C'結果unknown,因爲NULL = 'C'既沒有評估爲真也不假。表達不是真的,所以第一個IIF結果在'false'。因爲unknown的反向既不是真也不是假。該表達式不是真的,所以第二個IIF的結果也是'false'

這可能是您看到結果的原因嗎?

0

Gordon Linoff指出,如果某些值爲null,那麼您的代碼將無法正常工作,除此之外您應該看到預期的結果。

請記住,null = 'A'null而不是false。 ergo not(null = 'A')也是null

create table t (col1 char(1), col2 char(1), col3 char(1)); 
insert into t values 
('A','A','A') 
,('A','B','C') 
,('A','B',null) 
,(null,null,null) 
,('Z','Z',null) 
,('Z','Z','Z'); 

select *, 
    iif ( (col1 = 'A' or col2 = 'B' or col3 = 'C'), 'true', 'false') as test1, 
    iif (not(col1 = 'A' or col2 = 'B' or col3 = 'C'), 'true', 'false') as test2 
from t; 

rextester演示:http://rextester.com/CRYH34782

回報:

+------+------+------+-------+-------+ 
| col1 | col2 | col3 | test1 | test2 | 
+------+------+------+-------+-------+ 
| A | A | A | true | false | 
| A | B | C | true | false | 
| A | B | NULL | true | false | 
| NULL | NULL | NULL | false | false | 
| Z | Z | NULL | false | false | 
| Z | Z | Z | false | true | 
+------+------+------+-------+-------+ 

你可以換你列isnull()coalesces()null提供替代值。