2016-01-20 144 views
0

因此,我通過抓取數據庫A中的隨機行並根據其關鍵列在數據庫B中搜索這些行來比較兩個Oracle數據庫。然後我比較java中返回的行。Oracle選擇包含NULL值的IN子句列

我使用下面的查詢使用從數據庫中的鍵列來查找數據庫B行:

select * from mytable 
Where (Key_Column_A,Key_Column_B,Key_Column_C) 
in (('1','A', 'cat'),('2','B', 'dog'),('3','C', '')); 

這只是正常的前兩個集的密鑰,但第三個關鍵('3 ','C','')不起作用,因爲第三列中有一個空值。將語句更改爲('3','C',NULL)或將SQL更改爲

select * from mytable 
Where (Key_Column_A,Key_Column_B,Key_Column_C) 
in ((('1','A', 'cat'),('2','B', 'dog'),('3','C', '')) 
OR (Key_Column_A,Key_Column_B,Key_Column_C) IS NULL); 

也不起作用。

有沒有辦法在IN子句中包含空列?如果沒有,是否有辦法有效地做同樣的事情? (我目前唯一的解決方案是創建一個檢查以確保在我的密鑰中沒有可爲空的列,這會使此過程相當無效且有點混亂)。

+0

您是否動態生成此SELECT語句? –

+0

@BobJarvis是的,我是。 – JoshKni8

回答

2

你可以這樣使用它。我認爲這會奏效。

select * from mytable 
    Where (NVL(Key_Column_A,''),NVL(Key_Column_B,''),NVL(Key_Column_C,'')) 
    in (('1','A', 'cat'),('2','B', 'dog'),('3','C', '')); 

我不確定這個(Key_Column_A,Key_Column_B,Key_Column_C) IS NULL。這不意味着所有的列(A,B,C)都是NULL嗎?

+0

在我的Oracle版本中,NVL是未知命令。該嘗試是基於我在這裏看到的答案:http://stackoverflow.com/questions/6362112/in-clause-with-null-or-is-null – JoshKni8

+0

我不知道你的版本。使用等效,它會工作。例如,「合併」。 – DukeOfHazard

+0

順便說一下,你分享的線程與你的不同。它將一個值與一個列表進行比較。在這裏,您將列表與列表進行比較。 – DukeOfHazard