2014-07-23 151 views
0

我想我在Oracle數據庫(10g)中遇到了PL/SQL中一個相當簡單的問題,我希望你們中的一個能夠幫助我。PL/SQL Oracle條件等於

我試圖儘可能地解釋這一點,但對我來說很難。 當我嘗試比較2個不同表的varchar2值以檢查是否需要創建新記錄,或者我可以重新使用現有ID的ID時,DB(或I)以錯誤的方式比較這些值。當兩個字段都包含一個值時,這一切都很好,這會導致它理解的'a'='a'。但是當兩個字段都是NULL(或者''哪個Oracle會變成NULL')時,它就不能比較這些字段。

我發現這個問題的'解決方案',但我確定有更好的方法。

rowTable1 ROWTABLE1%ROWTYPE; 
iReUsableID INT; 

SELECT * INTO rowTable1 
FROM TABLE1 
WHERE TABLE1ID = 'someID'; 

SELECT TABLE2ID INTO iReUsableID 
FROM TABLE2 
WHERE NVL(SOMEFIELDNAME,' ') = NVL(rowTable1.SOMEFIELDNAME,' '); 

所以NVL改變null' '後,它會以正確的方式進行比較。

由於提前,

丹尼斯

回答

0

您的方法很好,除非其中一個值可以是空格。做比較的「標準」的方法是明確的比較NULL

WHERE col1 = col2 or col1 is null and col2 is null 

在Oracle中,對字符串的比較是由甲骨文對待空字符串爲NULL的事實阻礙。這是Oracle的一個特點,而不是其他數據庫中的問題。

+0

您需要括號:col1 = col2或(col1爲空,col2爲空) – Andrej

+1

@Andrej。 。 。雖然括號是一個好主意,但它們不是*必需的*。 '和'具有比'或'更高的優先級。 –

+1

我認爲你發佈的條件是最乾淨的。那謝謝啦! – Dennis

0

在Oracle(或相信任何RDBMS),一個NULL不等於另一個NULL。因此,如果要強制將2個NULL值視爲相同,則需要使用已聲明的解決方法。此外,您可能希望將NULL值默認爲「(空)而不是」(空格)。

維基百科(原來的ISO規範,但我不能訪問它):

由於null不是任何數據域的成員,它不被認爲是「價值」,而是一個標記(或佔位符)表示沒有價值。因此,與Null進行比較永遠不會導致True或False,但總是會出現在第三個邏輯結果Unknown中。

正如Jan Spurny所述,您可以使用LNNVL進行比較。但是,當比較兩個值爲NULL時實際進行比較是錯誤的。

0

這確實是一個簡單實用的方式來比較空。 由於NULL不等於NULL,所以不能直接比較NULLS。 您必須提供您自己想要比較的邏輯,以及您使用NVL()所做的工作。 請記住,您將NULLS視爲空間,因此在您的案例中,在一個表中,「在另一個表中等於NULL」。

還有其他一些方法(例如LNNVL),但我認爲它們不是某種「更好」的方式。