2016-09-30 154 views
0

我很有趣,我该如何在Oracle的where子句中使用if-then-else语句或任何控制结构。我想用为:如何在Oracle的where子句中使用IF THEN ELSE语句?

  • pcustomer_id IS NULL然后WHERE c.customer_id IS NULL
  • pcustomer_id IS NOT NULL然后c.customer_id = pcustomer_id

我该怎么办?

SELECT * 
    FROM customer_inf c 
WHERE 
IF 
pcustomer_id IS NULL THEN (c.customer_id IS NULL) 
    ELSE (c.customer_id = pcustomer_id) END IF; 
+0

你可以使用案例,当在条款 –

+0

你试过搜索吗?在SO – Aleksej

回答

4

你需要他们捆绑

where (
(pcustomer_id is null 
    and c.customer_id is null) 
or 
(pcustomer_id is not null 
    and c.customer_id = pcustomer_id) 
) 
+0

中有很多类似的问题为什么你需要在第二个分支中检查'pcustomer_id不为空'?无论如何,平等不会成立。 – mathguy

+0

@mathguy这是真的,但包括它使解决方案更容易遵循。 – JohnHC

1

使用布尔表达式:

SELECT * 
FROM customer_inf c 
WHERE (pcustomer_id IS NULL AND c.customer_id IS NULL) 
OR  (pcustomer_id IS NOT NULL AND cc.customer_id = pcustomer_id); 
+0

是不是与JohnHC一样的答案.. !!! – XING

+0

为什么您需要检查第二个分支中的“pcustomer_id不为空”?无论如何,平等不会成立。 – mathguy

0

如果我理解正确的话你只是想返回所有值时,c.customer_id = pcustomer_id包括null股权。所以:

select * from customer_inf c 
where nvl(pcustomer_id,'999999999999') = nvl(c.customer_id, '999999999999'); 

您只需要选择在您的真实数据中不会出现的数字。

+0

这个解决方案取决于一个假设,你会事先知道一个永远不会是id的字符串。在大多数组织中,这样的假设会使解决方案无法检查代码。 – mathguy

+0

你几乎总是可以将标识符放到所有真正使用的ID中,这个标识符要长得多或者更短。这只是为了避免或影响性能的工会。尤其是OR。 – Kacper

+0

将函数包装在函数中的效果与“或”的效果完全相同;事实上,优化器可能能够解决“或”而不是nvl调用。 – mathguy