Oracle使用IN子句选择包含NULL值的列

时间:2016-01-20 15:58:21

标签: sql oracle select null

所以我通过抓取数据库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子句中包含空列?如果没有,有没有办法有效地做同样的事情? (我目前唯一的解决方案是创建一个检查,以确保我的密钥中没有可以为空的列,这会使这个过程相当低效且有些混乱)。

1 个答案:

答案 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吗?