【问题标题】:Oracle Selecting Columns with IN clause which includes NULL valuesOracle 选择包含 NULL 值的 IN 子句的列
【发布时间】:2016-04-26 13:46:08
【问题描述】:

所以我通过抓取数据库 A 中的随机行并根据它们的关键列在数据库 B 中搜索这些行来比较两个 Oracle 数据库。然后我比较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 子句中包含一个空列?如果没有,有没有办法有效地做同样的事情? (我目前唯一的解决方案是创建一个检查以确保我的键中没有可以为空的列,这会使这个过程相当低效且有些混乱)。

【问题讨论】:

  • 你是动态生成这个SELECT语句吗?
  • @BobJarvis 是的,我是。

标签: sql oracle select null


【解决方案1】:

您可以这样使用它。我认为它会起作用。

 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 ?

【讨论】:

  • NVL 在我的 Oracle 版本中是一个未知命令。该尝试基于我在这里看到的答案:stackoverflow.com/questions/6362112/…
  • 空字符串和Oracle中的null一样,所以NVL(Key_Column_A,'')就是NVL(Key_Column_A,null),什么都做不了。
  • @Alex Poole 对!这样就可以使用NVL(Key_Column_A,'''''')(不漂亮)
  • @AlexPoole AHH 我想你已经解决了我的问题。我需要用一个临时值替换搜索到的空值。像 NVL(Key_Column_A,'N') IN ('N')
  • @JoshKni8 您还必须确保目标搜索也获得临时值而不是 ''。
猜你喜欢
  • 2017-12-23
  • 1970-01-01
  • 2016-05-11
  • 2010-09-12
  • 2013-07-26
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多