2016-09-30 156 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