2016-01-20 148 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