ORACLE中字符串比較
2024-08-29 13:31:36
供稿:網(wǎng)友
在oracle中,將空字符串視為null,任何值與null比較結(jié)果都為null。如此一來,在比較兩個(gè)字符串的時(shí)候就會(huì)出現(xiàn)意外。請(qǐng)看以下的例子:
declare
i varchar2(10) := null;
v varchar2(10) := 'abc';
begin
if(i = v) then
dbms_output.put_line('相等');
else
dbms_output.put_line('不等');
end if;
end;
請(qǐng)你用你聰明的頭腦判斷一下,結(jié)果應(yīng)該是什么?很容易就可以得出結(jié)果:'不等'。很好,你是對(duì)的。在sqlplus上運(yùn)行的結(jié)果和你想的一樣。那么我改一下程序,你再判斷一下:
declare
i varchar2(10) := null;
v varchar2(10) := 'abc';
begin
if(i <> v) then
dbms_output.put_line('不等');
else
dbms_output.put_line('相等');
end if;
end;
看上去和第一個(gè)程序沒有太大的差別,很容易就得出結(jié)果:'不等'。呵呵。你確定結(jié)果就是這個(gè)嗎?那么請(qǐng)你在sqlplus測(cè)試一下,來驗(yàn)證你是正確的。很可惜,正確的結(jié)果應(yīng)該是:'相等'。是不是很詫異?正如開始所說的:任何值與null比較結(jié)果都為null。即在第一個(gè)程序中的i=v比較的結(jié)果應(yīng)該是null,而第二個(gè)程序中的i<>v比較的結(jié)果也是null。當(dāng)if結(jié)構(gòu)中的條件為null時(shí),將跳過當(dāng)前的分支進(jìn)入到else或者是結(jié)束。不行嗎?那你運(yùn)行一下以下的程序?qū)⒖梢缘鹊津?yàn)證:
begin
if(null) then
dbms_output.put_line('not null');
else
dbms_output.put_line('null');
end if;
end;
結(jié)果輸出的是:'null'。
那么應(yīng)該怎樣正確的比較兩個(gè)字符串呢?
首先我先說說如何確定兩個(gè)字符串相等(還是用上邊的兩個(gè)變量i和v)。
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)來判斷它們是否相等。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ò)誤
is
if(var1 is null and var2 is null or var1 is not null and var2 is not null and var1 = var2) then
return 1;
else
return 0;
enf if;
begin
exception
when others then
return -1;
end;
以下上測(cè)試程序:
declare
var1 varchar2(10) := null;
var2 varchar2(10) := 'a';
begin
if(isequal(var1, var2) = 1) then
dbms_output.put_line('=');
else
dbms_output.put_line('<>');
end if;
end ;