是oracle 11g的预期行为。有人能解释为什么最后一个查询不包含空值吗?
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
答案 0 :(得分: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
s,那么您可以这样做:
select count(*) from table where statuscode <> 13 OR statuscode IS NULL