oracle sql过滤器可以为可空值

时间:2016-03-08 12:35:20

标签: sql oracle

是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

1 个答案:

答案 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
相关问题