2017-02-03 49 views
-1

在匿名塊中,我有一個空/空的輸入字符串,並希望檢查非空字符串。例如:Oracle - 如何判斷null和非空字符串?

DECLARE 
v_notnull varchar2(50):='this string is never null'; 
v_input varchar2(50):=''; 
BEGIN 
    IF trim(v_input) != trim(v_notnull) THEN 
     dbms_output.put_line('the strings do NOT match'); 
    ELSE 
     dbms_output.put_line('the strings DO match'); 
    END IF; 
END; 

這裏的問題是,當我運行該塊,輸出總是'the strings DO match'即使我輸入空字符串''(又名空)爲v_input這是不一樣的字符串'this string is never null'。我怎樣才能確保oracle覆蓋空字符串的情況?當v_input爲空時,我想輸出爲'the strings do NOT match'

+0

的問題是,你的代碼甚至不會編譯,做自己意思是「輸出總是......」?您缺少聲明的varchar2變量的長度,這是一個致命錯誤。 – mathguy

+0

好夥計....我在手機上打字。我已經解決了這個問題。 –

+0

這可能是oracle如何處理空比較的最簡潔的參考之一:http://www.morganslibrary.org/reference/null.html –

回答

3

The documentation has a section on null handling。空字符串的處理方式與空字符串相同,並且您無法比較空值(任何類型)和等式 - 如文檔中的表格所示,與null進行比較的結果是未知的 - 無論是真還是假。您必須使用is [not] null來比較任何與空值。

在這種情況下,你可以拼出來明確,通過看到的是一個變量爲空,另一種是不,反之亦然,如果告訴你也不是空僅比較實際值:

DECLARE 
v_notnull varchar2(30):='this string is never null'; 
v_input varchar2(30):=''; 
BEGIN 
    IF (trim(v_input) is null and trim(v_notnull) is not null) 
     or (trim(v_input) is not null and trim(v_notnull) is null) 
     or trim(v_input) != trim(v_notnull) THEN 
     dbms_output.put_line('the strings do NOT match'); 
    ELSE 
     dbms_output.put_line('the strings DO match'); 
    END IF; 
END; 
/

the strings do NOT match 


PL/SQL procedure successfully completed. 

我添加了缺少的varchar2尺寸;大概你基於這個程序,採取的參數沒有運行你張貼單獨...

3

''是在oracle中的NULL。所以,與null的任何比較總是會導致錯誤。

演示:

SQL> DECLARE 
    2 v_notnull varchar2(1000):='this string is never null'; 
    3 v_input varchar2(1000):=''; 
    4 BEGIN 
    5  IF v_input is null THEN 
    6   dbms_output.put_line('v_input is null'); -- should print because v_input is actually null 
    7  END IF; 
    8 
    9  IF trim(v_input) = trim(v_notnull) THEN  -- always false because of null 
10   dbms_output.put_line('the strings do NOT match'); 
11  ELSE 
12   dbms_output.put_line('the strings DO match'); -- so should print this 
13  END IF; 
14 END; 
15/
v_input is null   -- verified 
the strings DO match  -- verified 

PL/SQL procedure successfully completed. 

SQL> 
0

通常你只關心值匹配,無論是在這種情況下,空值是沒有區別的:

declare 
    v_notnull varchar2(50) := 'this string is never null'; 
    v_input varchar2(50) := ''; 
begin 
    if trim(v_input) = trim(v_notnull) then 
     dbms_output.put_line('the strings DO match'); 
    else 
     dbms_output.put_line('the strings do NOT match'); 
    end if; 
end; 

在某些情況下,你可以使用簡化可爲空值的比較a coalesce()nvl()表達式:

if nvl(v_yesno,'N') <> 'Y' then ... 

您可能能夠使用一個虛擬的比較值(儘管當然是有風險的,這將匹配的實際值,視情況而定):

if nvl(somevalue, chr(0)) <> nvl(othervalue, chr(0)) then ... 

順便說一句,你可以null和區分''通過將該值複製到char變量,因爲''將觸發其通常無用的空白填充行爲。我真的不能相信的情況下,這將是有益的,但只是爲了好玩:

declare 
    v1 varchar2(1) := null; 
    v2 varchar2(1) := ''; 

    c char(1); 
begin 
    c := v1; 
    if v1 is null and c is not null then 
     dbms_output.put_line('v1 = '''''); 
    elsif c is null then 
     dbms_output.put_line('v1 is null'); 
    end if; 

    c := v2; 
    if v2 is null and c is not null then 
     dbms_output.put_line('v2 = '''''); 
    elsif c is null then 
     dbms_output.put_line('v2 is null'); 
    end if; 

end; 

輸出:

v1 is null 
v2 = '' 
相關問題