如何在带有IS NULL的WHERE子句中使用CASE语句?

时间:2011-07-29 02:06:32

标签: sql oracle oracle11g

这是我的查询,它们不起作用,但我想做这样的事情:

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子句中。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:10)

听起来你只是从工具箱中选择了错误的工具。

除非我误解了你,否则以下内容:

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)

......应该如此。

答案 1 :(得分: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

在您的选择中,您使用的是另一个表达式的结果。这不会起作用。 如果要使查询正常工作,则必须使用第一个case表达式,并返回一个值,如下所示:

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)