Если заявления в WHERE оговорке - PullRequest
4 голосов
/ 19 января 2012

Возможно ли в Oracle поместить условные операторы IF в предложении WHERE?

Я хочу отфильтровать все строки с датой окончания до сегодняшнего дня.И если дата окончания пуста, она не должна фильтроваться по ней.Я пробовал это:

SELECT discount_amount 
FROM vw_ph_discount_data 
WHERE sysdate > start_date
AND
    IF 
        end_date IS NOT EMPTY 
    THEN 
        sysdate < end_date

Но я получаю "недопустимый оператор отношения".

Ответы [ 5 ]

9 голосов
/ 19 января 2012

Вы можете попробовать:

SELECT discount_amount 
FROM vw_ph_discount_data 
WHERE sysdate > start_date
AND sysdate < nvl(end_date,sysdate+1)
3 голосов
/ 19 января 2012

Я не думаю, что операторы if-else можно использовать в чистом SQL-коде. Вам нужно использовать хранимую процедуру для достижения вашей цели. Я полагаю, в вашем случае вы можете использовать код ниже:

DECLARE
  DATE end_date
BEGIN
  IF end_date IS NOT NULL THEN
    SELECT discount_amount 
    FROM vw_ph_discount_data 
    WHERE sysdate > start_date AND sysdate < end_date;
  END IF;
END;
3 голосов
/ 19 января 2012

Даже если это возможно, это не очень хорошая идея. Функции для каждой строки снижают производительность.

В этом случае наилучшим способом является объединение двух эксклюзивных запросов:

SELECT discount_amount 
    FROM vw_ph_discount_data 
    WHERE sysdate > start_date
    AND   end_date IS NULL
UNION ALL
SELECT discount_amount 
    FROM vw_ph_discount_data 
    WHERE sysdate > start_date
    AND   end_date IS NOT NULL
    AND   sysdate < end_date

(изменено на NULL с EMPTY, поскольку, похоже, это то, что вы хотели)

Предполагая, что end_date проиндексирован, это должно продолжаться, даже если это два запроса. Необходимость дополнительной обработки каждой возвращаемой строки редко является хорошей идеей.

Какие бы методы вы ни выбрали для исследования, сравните их с данными реального мира. Основная директива оптимизации - мера, не угадай.

1 голос
/ 19 января 2012

Вы можете использовать оператор IF для создания нескольких запросов или попробовать WHERE (end_date IS NULL OR end_date > SYSDATE).

Не уверен, следует ли вам использовать IS [NOT] EMPTY для "end_date". См. ПУСТО .

1 голос
/ 19 января 2012

Не могли бы вы сделать это:

SELECT discount_amount 
FROM vw_ph_discount_data 
WHERE sysdate > start_date
AND (end_date IS EMPTY OR sysdate < end_date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...