Как я могу использовать оператор CASE в предложении WHERE с IS NULL? - PullRequest
5 голосов
/ 29 июля 2011

Вот мои запросы, они не работают, но я хочу сделать что-то вроде этого:

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 ]

10 голосов
/ 29 июля 2011

Звучит так, как будто вы просто выбрали не тот инструмент из набора инструментов.

Если я вас ужасно не понял, то следующее:

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 голос
/ 01 августа 2011

Существует два способа использования оператора 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...