sqlPlus中的空值
2024-07-21 02:33:24
供稿:網友
當將版本提高到Oracle 8i時,應當非凡注重不可避免的“ n u l l”字符。 當表中的表列值未知時,就置它為空值( n u l l )。 在Oracle 8i中,含有空值的表列長度為零, 但要注重, 今后的版本中不一定是這樣。 比較操作中的空值問題 保存空值數據的唯一辦法是使用要害字“ is null”和“is not null”,如下所示:
select count(*)
from mytab
where cola is null;
select count(*)
from mytab
where cola is not null; 查詢語句“select count(*),count_amt from comm group by comm_amt;”返回以下輸出結果:
COUNT(*) COMM_AMT
- - - - - - - - - - - - - - - - - - -
12 1200
7 1700
8 對于n u l l比較操作,當采用其他結構時很快會碰到麻煩。 假設表中的c o m m _ a m t表列包含以下數據: Column Value Number of Rows
N u l l 8
1 2 0 0 1 2
1 7 0 0 7 當執行S Q L語句“select count(*) from comm where comm_amt<1700;”時, 其記數結果為1 2,這個結果來自于c o m m _ a m t表列中包含的非空值1 2 0 0的個數。而值為空的數據行沒有被記數。這是因為O r a c l e不明白那些為空的c o m m _ a m t表列的值,空沒有意義且不確定,所以空的表列值的數據行沒有被返回記數。下面將討論怎樣使用空的表列值進行比較操作。 使用N V L進行空值比較操作 n v l函數是解決空表列值比較的方法,下面列出了從c o m m表中檢索包含空值記數的語句: SQL>select count(*),nvl(comm_amt,0) from comm group by nvl(comm_amt,0);
COUNT(*) NVL (COMM_AMT,0)
------- ----------------
8 0
1 2 1 2 0 0
7 1 7 0 0 n v l函數用“ 0”值置換c o m m _ a m t表列中值為空的所有數據行, 使用這個新功能讓我們運行上述查詢, 檢索有多少個c o m m _ a m t表列值小于1 7 0 0的行。 SQL>select count(*) from comm where nvl (comm_amt,0)<1700;
COUNT (*)
- - - - - - - - -
2 0 下面再來討論一下字符串空表列值的比較操作的正確與錯誤的方法。隨著處理空表列值 能力的提高,將有助于用戶更好地理解空值數據。 The NULL=NULL比較的異常情況 假如不使用語法“is null”和“is not null”,將帶來麻煩,下面的語句對這一點做出了說明: SQL> select 12 from dual where null=''; 沒有任何資料列被選取 SQL> select 12 from dual where ''=''; 沒有任何資料列被選取 SQL> select 12 from dual where null=null; 沒有任何資料列被選取
SQL> select 12 from dual where null is null; 12
----------
12 SQL> select 12 from dual where nvl(null,'x')=nvl(null,'x'); 12
----------
12 Oracle 8i這種方法處理空值,許多開發者和數據庫治理員有時會有一種受到 挫折的感覺。很顯然,除了熟悉對空值的約定外別無它法,只有熟練地把握這方面的知識,才能保證查詢結果的正確。