正如菲爾所說,空字符串被視爲NULL,並且NULL不等於或不等於任何東西。如果你希望空字符串或NULL值,則需要用NVL()
來處理這些:
DECLARE
str1 varchar2(4000);
str2 varchar2(4000);
BEGIN
str1:='';
str2:='sdd';
-- Provide an alternate null value that does not exist in your data:
IF(NVL(str1,'X') != NVL(str2,'Y')) THEN
dbms_output.put_line('The two strings are not equal');
END IF;
END;
/
關於空比較:
按照Oracle 12c documentation on NULLS,使用空比較IS NULL
或IS NOT NULL
做評估爲TRUE
或FALSE
。然而,所有其他比較評估爲UNKNOWN
,而不是FALSE
。該文檔還指出:
評估爲UNKNOWN的條件行爲幾乎與FALSE相同。例如,WHERE子句中條件爲UNKNOWN的SELECT語句不返回任何行。但是,評估爲UNKNOWN的條件與FALSE的不同之處在於,對未知條件評估的進一步操作將評估爲UNKNOWN。因此,NOT FALSE評估爲TRUE,但NOT UNKNOWN評估爲UNKNOWN。
參考表由Oracle提供:
Condition Value of A Evaluation
----------------------------------------
a IS NULL 10 FALSE
a IS NOT NULL 10 TRUE
a IS NULL NULL TRUE
a IS NOT NULL NULL FALSE
a = NULL 10 UNKNOWN
a != NULL 10 UNKNOWN
a = NULL NULL UNKNOWN
a != NULL NULL UNKNOWN
a = 10 NULL UNKNOWN
a != 10 NULL UNKNOWN
我也瞭解到,我們不應該寫PL/SQL假設空字符串將始終評估爲NULL:
Oracle數據庫目前將長度爲零的字符值視爲null。但是,這在未來的版本中可能不會繼續存在,並且Oracle建議您不要將空字符串視爲空值。
請記住,在Oracle中,一個空字符串相當於'NULL',它可能無法按預期在不等式比較語句中工作 – Phil
您能否給我關於如何解決這個問題的一些建議? –
這是兩個截然不同的問題。你應該問問他們,因爲這是SO的工作原理。話雖如此,你的第二個問題是已經被多次回答的老栗子。請在搜索前詢問:http://stackoverflow.com/questions/tagged/oracle+string-aggregation – APC