【開發篇sql】 條件和表示式(三) Null詳解

yellowlee發表於2010-05-15

3Null詳解

 

一行的一個cell如果沒有值,那麼就是null的,注意並不是他的值是null,所以col=nullcol is null是完全不同的,null有很多特性,可以簡單看幾個例子來說明:

 

SQL> insert into t_test_chr  values ('1','',null);

 

1 row created.

 

SQL> select * from t_test_chr where type_char=1;

 

TYPE TYPE_VARCHAR2        TYPE_NVARCHAR2

---- -------------------- --------------------

1

SQL> select * from t_test_chr where type_varchar2 is null and type_nvarchar2 is null;

 

TYPE TYPE_VARCHAR2        TYPE_NVARCHAR2

---- -------------------- --------------------

1

可以看出,''null都是沒有值的,可以認為他們相同,但是:

SQL> select * from dual where ''=null;

 

no rows selected

 

SQL> select * from dual where '' is null;

 

D

-

X

 

同樣的情況:

SQL> select * from dual where '' ='';

 

no rows selected

 

SQL> select * from dual where null =null;

 

no rows selected

 

SQL> select * from dual where 1!=null;

 

no rows selected

 

這說明null不等於null,其他任何值與null的比較,結果是未知的。

在一些關聯問題中欄位包含了null值,通常情況下可以使用外連線來解決null值的影響。

同時也可以利用null的特性來實現一些特定的需求,比如:

SQL> create table t_test_null(id number,send_time date ,recv_time date );

 

Table created.

SQL> insert into t_test_null

  2    select 1, sysdate, '' from dual;

 

1 row created.

SQL> insert into t_test_null

  2    select 1, '', sysdate from dual;

 

1 row created.

插入的兩條資料如果是模擬某種成對的操作,現在要知道某個id下面的sendrecv時間,並且在一條中顯示(往往情況比這個複雜),那麼就可以使用:

SQL> select id ,min(send_time),min(recv_time) from t_test_null group by id;

 

        ID MIN(SEND_ MIN(RECV_

---------- --------- ---------

         1 16-MAY-10 16-MAY-10

或者使用max也可以,因為null的“值”比其他都小,或者都大。

 

一般為了消除控制欄位中的null值出現,可以增加一個 not null約束,增加not null約束之後新插入或者更新後的欄位值不允許為null,但是要注意的是,這個約束對增加之前已有的資料不會檢查。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16179598/viewspace-662798/,如需轉載,請註明出處,否則將追究法律責任。

相關文章