2016-03-08 22 views
1

這是Oracle 11g的預期行爲。有人可以解釋爲什麼最後一個查詢不包含空值嗎?對於可空值的oracle sql過濾器

table 

statuscode 
13 
null 
--------------------------------------------------------- 
select count(*) from table -- returns 2 
select count(*) from table where statuscode = 13 --returns 1 
select count(*) from table where statuscode <> 13 --returns 0 
+5

這是預期的行爲。這就是'NULL'值的工作方式 - 除'null'之外的所有比較都返回相當於false的值。 –

+1

http://stackoverflow.com/questions/12853944/why-in-sql-null-cant-match-with-null –

+0

我測試它與「是null」工作,但不知道原因。謝謝。 – cacert

回答

2

NULL覺得作爲一個未知值與測試,如果事情等於(或不等於)未知會導致未知(NULL)作爲答案。當布爾過濾器爲TRUE時,SQL查詢將顯示結果,如果一個值爲NULL,情況就不會如此。

可以在PL/SQL測試邏輯(因爲它有一個可訪問BOOLEAN型):

SET SERVEROUTPUT ON; 
DECLARE 
    FUNCTION bool_to_string(bool BOOLEAN) RETURN VARCHAR2 
    AS 
    BEGIN 
    RETURN CASE WHEN bool IS NULL THEN 'NULL' 
       WHEN bool = TRUE THEN 'TRUE' 
       WHEN bool = FALSE THEN 'FALSE' 
       ELSE     'ERROR' END; 
    END; 
BEGIN 
    DBMS_OUTPUT.PUT_LINE('A = A => ' || bool_to_string('A' = 'A')); 
    DBMS_OUTPUT.PUT_LINE('A <> A => ' || bool_to_string('A' <> 'A')); 
    DBMS_OUTPUT.PUT_LINE('A = NULL => ' || bool_to_string('A' = NULL)); 
    DBMS_OUTPUT.PUT_LINE('A <> NULL => ' || bool_to_string('A' <> NULL)); 
END; 
/

,輸出:

A = A => TRUE 
A <> A => FALSE 
A = NULL => NULL 
A <> NULL => NULL 

注意,最後兩個測試不返回FALSE但返回NULL

如果你想數包括NULL當時的你可以這樣做:

select count(*) from table where statuscode <> 13 OR statuscode IS NULL 
+0

很好的解釋,謝謝。 – cacert