2011-07-29 156 views
4

這裏是我的查詢,他們沒有工作,但我想要做這樣的事情:如何在IS NULL的WHERE子句中使用CASE語句?

SELECT a_field FROM a_table 
WHERE 
... 
AND 
CASE 
WHEN a_value_from_another_query IS NULL THEN a_second_field IS NULL 
ELSE a_second_field = a_value_from_another_query 
END 

或者

SELECT a_field FROM a_table 
WHERE 
... 
AND 
CASE a_value_from_another_query 
WHEN NULL THEN a_second_field IS NULL 
ELSE a_second_field = a_value_from_another_query 
END 

或者

SELECT a_field FROM a_table 
WHERE 
... 
AND 
CASE NVL(a_value_from_another_query, 'x') 
WHEN 'x' THEN a_second_field IS NULL 
ELSE a_second_field = a_value_from_another_query 
END 

a_value_from_another_query IS NULL,我要添加a_second_field IS NULL到我的WHERE子句,當a_value_from_another_query IS NOT NULL,我想將a_second_field = a_value_from_another_query添加到我的WHERE子句中。我怎樣才能做到這一點?

+0

你將不得不澄清你的思想 - 然後再解釋。你可以使用'CASE expr WHEN value THEN ...'表示法,或者你可以使用'CASE when expr THEN ...',但是你簡單的'CASE WHEN NULL THEN'表示法永遠不會評估THEN,因爲NULL總是會評估到UNKNOWN,而不是TRUE。 –

+0

'CASE當字段爲NULL ...' –

+0

發佈更多的查詢,如果你想要一個關於如何完成條件連接標準的答案。 –

回答

9

聽起來像你只是從工具箱拿起錯誤的工具。

,除非我有可怕的誤解你,以下內容:

WHERE 
    (a_value_from_another_query IS NULL AND a_second_field IS NULL) 
    OR 
    (a_value_from_another_query IS NOT NULL AND a_second_field = a_value_from_another_query) 

...應該這樣,你想要什麼。

+0

你說得對,我看錯了方向。謝謝! – codea

1

有兩種方法使用CASE語句:

1. CASE WHEN condition_1 THEN return_expr_1 
    [WHEN condition_2 THEN return_expr_2 ….] 
    [WHEN condition_n THEN return_expr_n ….] 
    [ELSE default] END 
2. CASE expression WHEN value1 THEN result1 
[WHEN value2 THEN result2 
..... 
ELSE resultn 
] 
END 

在你的選擇,你正在使用,而不是一個結果,另一種表達。這是行不通的。 如果你希望得到您的查詢工作,你必須使用第一種情況下表達,並返回一個值,像這樣:

SELECT a_field FROM a_table 
WHERE 
... 
AND nvl(a_second_field,'x')=(CASE WHEN a_value_from_another_query IS NULL THEN 'X' 
ELSE a_value_from_another_query END)