在oracle中,將空字符串視為null,任何值與null比較結(jié)果都為null。如此一來(lái),在比較兩個(gè)字符串的時(shí)候就會(huì)出現(xiàn)意外。請(qǐng)看以下的例子:declarei
創(chuàng)新互聯(lián)公司長(zhǎng)期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為武寧企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè),武寧網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
varchar2(10)
:=
null;
v
varchar2(10)
:=
'abc';beginif(i
=
v)
then
v
varchar2(10)
:=
'abc';beginif(i
v)
then
dbms_output.put_line('不等');elsedbms_output.put_line('相等');end
if;end;看上去和第一個(gè)程序沒有太大的差別,很容易就得出結(jié)果:'不等'。呵呵。你確定結(jié)果就是這個(gè)嗎?那么請(qǐng)你在sqlplus測(cè)試一下,來(lái)驗(yàn)證你是正確的。很可惜,正確的結(jié)果應(yīng)該是:'相等'。是不是很詫異?正如開始所說(shuō)的:任何值與null比較結(jié)果都為null。即在第一個(gè)程序中的i=v比較的結(jié)果應(yīng)該是null,而第二個(gè)程序中的iv比較的結(jié)果也是null。當(dāng)if結(jié)構(gòu)中的條件為null時(shí),將跳過(guò)當(dāng)前的分支進(jìn)入到else或者是結(jié)束。不行嗎?那你運(yùn)行一下以下的程序?qū)⒖梢缘鹊津?yàn)證:beginif(null)
then
dbms_output.put_line('not
null');elsedbms_output.put_line('null');end
if;end;結(jié)果輸出的是:'null'。
1、當(dāng)i和v都為null的時(shí)候,認(rèn)為i和v相等。i
is
null
and
v
is
null(不要寫成這樣:i
=
v。從上邊的分析我們可以知道這樣寫的結(jié)果為null)。
2、當(dāng)i和v中只有一個(gè)為null,肯定不相等。
3、當(dāng)i和v都不為null的時(shí)候,我們就可以用‘=’號(hào)來(lái)判斷它們是否相等。i
is
not
null
and
v
is
not
null
and
i
=
v。
根據(jù)以上三點(diǎn),我們可以得出判斷i和v相等的條件表達(dá)式:i
is
null
and
v
is
null
or
i
is
not
null
and
v
is
not
null
and
i
=
v。
那么兩個(gè)字符串不相等的條件表達(dá)式只需要判斷相等的表達(dá)式為false就可以了。
把判斷兩個(gè)字符串是否相等的功能寫成函數(shù):
create
or
replace
function
isequal(var1
in
varchar2,
var2
in
varchar2)return
number
--
0:不等
1:相等
-1:錯(cuò)誤isif(var1
is
null
and
var2
is
null
or
var1
is
not
null
and
var2
is
not
null
and
var1
=
var2)
thenreturn
1;elsereturn
0;enf
if;beginexceptionwhen
others
thenreturn
-1;end;以下上測(cè)試程序:declarevar1
varchar2(10)
:=
null;
Oracle比較字符串是根據(jù)ASCII碼來(lái)的,第一個(gè)字母的ASCII大小比較如果相等再比較下一個(gè),類推。字符串和數(shù)字進(jìn)行操作是會(huì)報(bào)異常的,因?yàn)轭愋筒灰粯硬荒苓M(jìn)行比較。Oracle在執(zhí)行SQL的時(shí)候有些時(shí)候會(huì)自動(dòng)轉(zhuǎn)換,比如:select
*
from
chan_customer
cc
where
cc.customer_id
=
'1';即使customer_id是數(shù)字型的也可以查出來(lái),但是Oracle有區(qū)分字符和數(shù)字就是通過(guò)加不加單引號(hào)來(lái)區(qū)分。
在ORACLE中,將空字符串視為NULL,任何值與NULL比較結(jié)果都為NULL。如此一來(lái),在比較兩個(gè)字符串的時(shí)候就會(huì)出現(xiàn)意外。請(qǐng)看以下的例子:DECLAREi VARCHAR2(10) := NULL;
v VARCHAR2(10) := 'ABC';BEGINIF(i = v) THEN
v VARCHAR2(10) := 'ABC';BEGINIF(i v) THEN
DBMS_OUTPUT.PUT_LINE('不等');ELSEDBMS_OUTPUT.PUT_LINE('相等');END IF;END;看上去和第一個(gè)程序沒有太大的差別,很容易就得出結(jié)果:'不等'。呵呵。你確定結(jié)果就是這個(gè)嗎?那么請(qǐng)你在SQLPLUS測(cè)試一下,來(lái)驗(yàn)證你是正確的。很可惜,正確的結(jié)果應(yīng)該是:'相等'。是不是很詫異?正如開始所說(shuō)的:任何值與NULL比較結(jié)果都為NULL。即在第一個(gè)程序中的i=v比較的結(jié)果應(yīng)該是NULL,而第二個(gè)程序中的iv比較的結(jié)果也是NULL。當(dāng)IF結(jié)構(gòu)中的條件為NULL時(shí),將跳過(guò)當(dāng)前的分支進(jìn)入到ELSE或者是結(jié)束。不行嗎?那你運(yùn)行一下以下的程序?qū)⒖梢缘鹊津?yàn)證:BEGINIF(NULL) THEN
DBMS_OUTPUT.PUT_LINE('NOT NULL');ELSEDBMS_OUTPUT.PUT_LINE('NULL');END IF;END;結(jié)果輸出的是:'NULL'。
1、當(dāng)i和v都為NULL的時(shí)候,認(rèn)為i和v相等。i IS NULL AND v IS NULL(不要寫成這樣:i = v。從上邊的分析我們可以知道這樣寫的結(jié)果為NULL)。
2、當(dāng)i和v中只有一個(gè)為NULL,肯定不相等。
3、當(dāng)i和v都不為NULL的時(shí)候,我們就可以用‘=’號(hào)來(lái)判斷它們是否相等。i IS NOT NULL AND v IS NOT NULL AND i = v。
根據(jù)以上三點(diǎn),我們可以得出判斷i和v相等的條件表達(dá)式:i IS NULL AND v IS NULL OR i IS NOT NULL AND v IS NOT NULL AND i = v。
那么兩個(gè)字符串不相等的條件表達(dá)式只需要判斷相等的表達(dá)式為FALSE就可以了。
把判斷兩個(gè)字符串是否相等的功能寫成函數(shù):
CREATE OR REPLACE FUNCTION ISEQUAL(VAR1 IN VARCHAR2,
VAR2 IN VARCHAR2)RETURN NUMBER -- 0:不等 1:相等 -1:錯(cuò)誤ISIF(VAR1 IS NULL AND VAR2 IS NULL OR VAR1 IS NOT NULL AND VAR2 IS NOT NULL AND VAR1 = VAR2) THENRETURN 1;ELSERETURN 0;ENF IF;BEGINEXCEPTIONWHEN OTHERS THENRETURN -1;END;以下上測(cè)試程序:DECLAREVAR1 VARCHAR2(10) := NULL;