Oracle中的NULL和空字符串 |
發(fā)布時間: 2012/8/30 16:47:18 |
Oracle中有個關(guān)鍵字叫NULL,它表示某個值是未知的、是不確定的。既然是未知的,就有無數(shù)種的可能性。因此,NULL并不是一個確定的值。先看兩個例子吧: 例1:declare v_b1 boolean:=null; --布爾值可以賦值null.當(dāng)然它另外兩種值只能是true,false了
v_a int := null; if(v_b1) then --把v_b1改成not v_b1結(jié)果都一樣.也就是v_b1和把它取反都不會是true if(true or v_b1) then --輸出v_b1 equal true
例2:create table test (ename char(1),constraint ck_test check(ename in ('a',null))); --上面的語句創(chuàng)建一個表,只有一列ename,給此列添加約束條件,它的值只能在列表('a',null)中.但實際上我們可以插入任何字符.這時貌似null可以代表所有的字符了.去掉它只能插入'a' 但如果我們這樣創(chuàng)建表 create table test1 (ename char(1),constraint ck_test check(ename not in ('a',null))); --按我們猜想如果null能代表所有字符了那它取反就是不能輸入任何字符.但實際上不是.此處它貌似沒起任何作用.去掉它和不去掉效果一樣.都可以插入除'a'外的任何字符
1.怎么理解null的這些用法看了上面兩個例子是不是有點暈了啊,其實我們可以這樣理解.既然null是個不確定的類型,就可以轉(zhuǎn)變成任何類型中的任何值.就像C#中的object類型.它是任何類型的父類.可以代表任何類型.我們可以在運行程序時再去動態(tài)確定它的具體類型.那么null如果是處在一個條件判斷條件中得讓它取特定類型的所有值去進(jìn)行判斷.如果結(jié)果都為真才為真. 如例1中兩個整數(shù)值v_a,v_b都是null.要讓他們相等得讓null取所有的整數(shù)去判斷.那樣自然不可能都相等.所以為假.而true or v_b1之所以為真了是因為or前面的為真的話不去對后面的v_b1做判斷了.而v_b1和not v_b1都為假則可以認(rèn)為v_b1可以取true和false,把這兩種值都代入則不可能保證都為true所以最終結(jié)果為false. 這樣來理解了null就不難明白為什么我們在一個表中插入一個null值.但我們不能通過判斷條件=null來查詢.不過Oracle提供了關(guān)鍵字is來判斷一個值是否是null. 例2中第二種情況是有點反常.我們就當(dāng)作如果什么都不讓用戶插入,但建個表沒啥意義.所以不這樣 至于Oracle后臺是怎么存儲null值和操作null值的就不清楚了啊.
2.null和空字符串其實空字符串和其他字符的操作是一樣的.只是用它的時候眼神要好點,別搞錯了.舉個例子 先建表create table arwen(ename varchar2(1)); --此列只能插入一個字符 insert into arwen values(' ');--注意引號中是一個空格.如果是兩個空格會出錯的,因為是兩個字符了. select * from arwen where ename = ' '; --返回一行.這里引號中也必須是一個空格. 如果是''也就是引號中沒空格.那插入它時Oracle默認(rèn)把它變成null了.所以如果引號中沒空格我們就不能叫它空字符串了啊.不知道叫啥好啊.覺得有null了它好像有點多余 例如create table arwen(eno int); insert into arwen values(44); insert into arwen alues(''); --引號是沒有空格 insert into arwen alues(null); 這上面三條語句都會成功插入. 雖然''被默認(rèn)轉(zhuǎn)換成null但我們不能用is '' 或=''來用它 例如你select count(*) from arwen 或者select count(*) from arwen where ename is null--結(jié)果是3 但如果是select count(*) from arwen where ename is ‘’ 或者 select count(*) from arwen where ename =‘’結(jié)果就是0
3.我們要用到null時常會用到函數(shù)nvl函數(shù).就是如果碰到哪個地方是null就把它轉(zhuǎn)換成其他的東東 例如上面插入三行后我們這樣查找select nvl(ename,11) from arwen; --結(jié)果是44 11 11 ename如果是null就轉(zhuǎn)換成11如果不是null就原樣輸出
4.使用null時注意在用avg,max,min這些函數(shù)時會把null忽略掉 比如create table arwen(eno int); insert into arwen values(1); insert into arwen values(2); insert into arwen values(null); select avg(eno) from arwen;--結(jié)果為1.5.這是因為忽略掉null了不然應(yīng)該是1的 select max(eno) from arwen;--結(jié)果為2 如果在排序中會把null當(dāng)作最大值處理.就像無窮大一樣
在往表中插入數(shù)據(jù)時如果某列沒有插入值就讓它為null,這對用戶來說是非常方便的.但在其他地方用它好像沒太大必要.所以盡量別用好了.只是在對表做些操作時多注意考慮到null判斷就好.多用nvl函數(shù)和is null判斷本文出自:億恩科技【www.allwellnessguide.com】
v_a int := null; if(v_b1) then --把v_b1改成not v_b1結(jié)果都一樣.也就是v_b1和把它取反都不會是true if(true or v_b1) then --輸出v_b1 equal true
例2:create table test (ename char(1),constraint ck_test check(ename in ('a',null))); --上面的語句創(chuàng)建一個表,只有一列ename,給此列添加約束條件,它的值只能在列表('a',null)中.但實際上我們可以插入任何字符.這時貌似null可以代表所有的字符了.去掉它只能插入'a' 但如果我們這樣創(chuàng)建表 create table test1 (ename char(1),constraint ck_test check(ename not in ('a',null))); --按我們猜想如果null能代表所有字符了那它取反就是不能輸入任何字符.但實際上不是.此處它貌似沒起任何作用.去掉它和不去掉效果一樣.都可以插入除'a'外的任何字符
1.怎么理解null的這些用法看了上面兩個例子是不是有點暈了啊,其實我們可以這樣理解.既然null是個不確定的類型,就可以轉(zhuǎn)變成任何類型中的任何值.就像C#中的object類型.它是任何類型的父類.可以代表任何類型.我們可以在運行程序時再去動態(tài)確定它的具體類型.那么null如果是處在一個條件判斷條件中得讓它取特定類型的所有值去進(jìn)行判斷.如果結(jié)果都為真才為真. 如例1中兩個整數(shù)值v_a,v_b都是null.要讓他們相等得讓null取所有的整數(shù)去判斷.那樣自然不可能都相等.所以為假.而true or v_b1之所以為真了是因為or前面的為真的話不去對后面的v_b1做判斷了.而v_b1和not v_b1都為假則可以認(rèn)為v_b1可以取true和false,把這兩種值都代入則不可能保證都為true所以最終結(jié)果為false. 這樣來理解了null就不難明白為什么我們在一個表中插入一個null值.但我們不能通過判斷條件=null來查詢.不過Oracle提供了關(guān)鍵字is來判斷一個值是否是null. 例2中第二種情況是有點反常.我們就當(dāng)作如果什么都不讓用戶插入,但建個表沒啥意義.所以不這樣 至于Oracle后臺是怎么存儲null值和操作null值的就不清楚了啊.
2.null和空字符串其實空字符串和其他字符的操作是一樣的.只是用它的時候眼神要好點,別搞錯了.舉個例子 先建表create table arwen(ename varchar2(1)); --此列只能插入一個字符 insert into arwen values(' ');--注意引號中是一個空格.如果是兩個空格會出錯的,因為是兩個字符了. select * from arwen where ename = ' '; --返回一行.這里引號中也必須是一個空格. 如果是''也就是引號中沒空格.那插入它時Oracle默認(rèn)把它變成null了.所以如果引號中沒空格我們就不能叫它空字符串了啊.不知道叫啥好啊.覺得有null了它好像有點多余 例如create table arwen(eno int); insert into arwen values(44); insert into arwen alues(''); --引號是沒有空格 insert into arwen alues(null); 這上面三條語句都會成功插入. 雖然''被默認(rèn)轉(zhuǎn)換成null但我們不能用is '' 或=''來用它 例如你select count(*) from arwen 或者select count(*) from arwen where ename is null--結(jié)果是3 但如果是select count(*) from arwen where ename is ‘’ 或者 select count(*) from arwen where ename =‘’結(jié)果就是0
3.我們要用到null時常會用到函數(shù)nvl函數(shù).就是如果碰到哪個地方是null就把它轉(zhuǎn)換成其他的東東 例如上面插入三行后我們這樣查找select nvl(ename,11) from arwen; --結(jié)果是44 11 11 ename如果是null就轉(zhuǎn)換成11如果不是null就原樣輸出
4.使用null時注意在用avg,max,min這些函數(shù)時會把null忽略掉 比如create table arwen(eno int); insert into arwen values(1); insert into arwen values(2); insert into arwen values(null); select avg(eno) from arwen;--結(jié)果為1.5.這是因為忽略掉null了不然應(yīng)該是1的 select max(eno) from arwen;--結(jié)果為2 如果在排序中會把null當(dāng)作最大值處理.就像無窮大一樣
在往表中插入數(shù)據(jù)時如果某列沒有插入值就讓它為null,這對用戶來說是非常方便的.但在其他地方用它好像沒太大必要.所以盡量別用好了.只是在對表做些操作時多注意考慮到null判斷就好.多用nvl函數(shù)和is null判斷本文出自:億恩科技【www.enidc.com】 --> 服務(wù)器租用/服務(wù)器托管中國五強!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |