所以我通过抓取数据库A中的随机行来比较两个Oracle数据库,并根据它们的键列在数据库B中搜索这些行。然后我比较java中返回的行。
我使用以下查询使用数据库A中的键列来查找数据库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 :(得分: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吗?