2016-04-24 2 views
0

В настоящее время у меня есть 2 разных сценария sql, которые мне нужно запускать в зависимости от дня недели. Я пытаюсь найти способ объединить их в один, и у меня есть логика, чтобы проверить, в какой день недели это происходит, и на основе этого исходят соответствующие изменения.SQL-заявление с использованием AND в зависимости от дня недели

Так основная структура:

SELECT * FROM table 
WHERE foo = 'bar' 
AND foo2 = 'bar2' 
AND foo3 = 'bar3'; 

Единственная разница, если это понедельник, один из случаев и нужно изменить.

Так псевдокод я должен выглядеть примерно так:

SELECT * FROM table 
WHERE foo = 'bar' 
AND foo2 = 'bar2' 

if day = 'Monday' then 
AND foo3 = 'bar3' 
else 
AND foo3 = 'bar3a'; 

Любые идеи? Я попытался включить Case Select, основанный на this, но не сработал для меня.

Спасибо!

ответ

3

Я думаю, что правильный логика:

WHERE foo = 'bar' AND 
     foo2 = 'bar2' 
     ((TO_CHAR(SYSDATE, 'Dy') = 'Mon' AND foo3 = 'bar3')) OR 
     (TO_CHAR(SYSDATE, 'Dy') <> 'Mon' AND foo3 = 'bar3a') 
    ) 

Два важных соображения:

  • Это проверка как для понедельника и не-понедельник.
  • В нем используются сокращенные даты, а не полное имя. Oracle указывает имена дат, поэтому результат не 'Monday', а 'Monday ', и пробелы могут изменить ситуацию.
  • Как упоминает Торстейн, вы можете добавить третий аргумент, 'NLS_DATE_LANGUAGE=AMERICAN', чтобы результат был на английском языке.
+0

Спасибо! Кажется, он работает отлично! Также спасибо, я полностью забыл о заполнении дней в Oracle. – SS113

+1

Хороший ответ. Тем не менее, следует четко указать язык при работе с именами, чтобы не зависеть от соответствующих настроек сеанса: 'TO_CHAR (SYSDATE, 'Dy', 'NLS_DATE_LANGUAGE = AMERICAN')'. –

1

A case выражение возвращает значение. Он не может использоваться, как указано в вопросе в предложении where.

Экспресс ваши условия, используя and и or.

SELECT * FROM table 
WHERE foo = 'bar' 
AND foo2 = 'bar2' 
AND (
    (TO_CHAR(SYSDATE, 'Day') = 'Monday' AND foo3 = 'bar3') OR foo3 = 'bar3a' 
    ) 
+0

Благодарим vkp за быстрый ответ. Я попробовал несколько примеров с этим кодом в таблице демо-сотрудников, и по какой-то причине он всегда выбирает сторону OR независимо от того, какой день недели я установил. Итак: 'SELECT * FROM emp WHERE JOB = 'MANAGER' И ((TO_CHAR (SYSDATE, 'Day') = 'Sunday' AND COMM = 3) ИЛИ COMM = 7);' всегда будут возвращать менеджерам с комиссией = 7 – SS113

Смежные вопросы