NULL也疯狂

       今天刚好一个网友碰到这样的问题,给出两个语句,从字面上没什么差异,但是执行的结果却差的很远。这里给出类似的重现的实例,下面给出表的结构:

create table TA
(
  C1 NUMBER(20),
  C2 VARCHAR2(20)
);
INSERT INTO ta VALUES(1,'2');
INSERT INTO ta(c2) VALUES('3');
create table TB
(
  C1 NUMBER(20),
  C3 VARCHAR2(20)
);
INSERT INTO tb VALUES(1,'x');
INSERT INTO tb VALUES(3,'y');

下面给出两个SQL,

--1.
SELECT * FROM tb WHERE c1 NOT IN (SELECT c1 FROM ta);
--2.
SELECT c1  FROM tb
MINUS
SELECT c1 FROM ta;

       按常理说应该返回C1=3那条记录,但是不是,第一个语句没有返回任何结果集,第二个返回的是3。原来Oracle对条件的判断不是按我们常规的想象实现的。这里minus暂且不谈,关于oracle的集合操作是另一套机制。出现这种问题的原因是在select C1 from ta中含有NULL值。下面我们分析NULL的值是怎么回事?我们对上面的提炼一下,从下面开始讨论:

SQL> select 1 from dual where 1  in (1,null);
 
         1
----------
         1
 
SQL> select * from dual where null in (null);
 
DUMMY
-----
 
SQL> select *  from dual where 2 not in (1,null);
 
DUMMY
-----
 
SQL> select decode(null,null,'NULL') from dual;
 
DECODE(NULL,NULL,'NULL')
------------------------
NULL
 
SQL> select decode('',null,'NULL') from dual;
 
DECODE('',NULL,'NULL')
----------------------
NULL
说点我的理解:
1、第一个SQL返回的结果在我们的想象范围内,不必多说。
2、null不合任何值相等,包括自身,也能理解。
3.2不等于1这个能理解,当oracle判断2不等于null吗?我们的回答是NO,但是oracle的判断是unknown,对于unknown,oracle不返回结果集。
4.但是null真的永远都不和null相等吗?我们的回答依然是NO,在decode函数中例外。
5、在oracle中''和null等价的。

你可能感兴趣的:(oracle,sql,c,null,table,insert)