Запрос Oracle SQL / PLSQL: CASE в выражении WHERE - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь запросить oracle db, но не могу заставить скрипт работать.Сценарий предназначен для поиска сотрудников с start_date между двумя датами.К сожалению, не все сотрудники имеют start_date в базе данных, но все сотрудники имеют create_date.То, что я хотел бы сделать, это:

IF START_DATE IS NULL:
    (E.START_DATE >= TO_DATE('10/29/2014', 'MM/DD/YYYY') AND E.START_DATE <= TO_DATE('10/29/2016', 'MM/DD/YYYY')
ELSE: 
    (E.CREATE_DATE >= TO_DATE('10/29/2014', 'MM/DD/YYYY') AND E.CREATE_DATE <= TO_DATE('10/29/2016', 'MM/DD/YYYY')

Вот что у меня есть до сих пор:

SELECT OC.DESCRIPTION "Description",
sum(S.AMOUNT) "SUM",
COUNT (DISTINCT(E.EMPLOYEE_NUM)) "Employee Nums"
FROM EMPLOYEES E
JOIN EMPLOYEE_SPENDING S ON S.EMPLOYEE_ID = E.EMPLOYEE_ID
WHERE E.EMPLOYEE_CATEGORY IN ('ACTIVE', 'INACTIVE')
AND ((E.START_DATE >= TO_DATE('10/29/2014', 'MM/DD/YYYY') AND E.START_DATE <= TO_DATE('10/29/2016', 'MM/DD/YYYY'))
OR (E.CREATE_DATE >= TO_DATE('10/29/2014', 'MM/DD/YYYY') AND E.CREATE_DATE <= TO_DATE('10/29/2016', 'MM/DD/YYYY')))
GROUP BY E.EMPLOYEE_CATEGORY;

Мое утверждение case выглядело примерно так:

SELECT OC.DESCRIPTION "Description",
sum(S.AMOUNT) "SUM",
COUNT (DISTINCT(E.EMPLOYEE_NUM)) "Employee Nums"
FROM EMPLOYEES E
JOIN EMPLOYEE_SPENDING S ON S.EMPLOYEE_ID = E.EMPLOYEE_ID
WHERE E.EMPLOYEE_CATEGORY IN ('ACTIVE', 'INACTIVE')
AND (CASE WHEN E.START_DATE IS NULL THEN (E.START_DATE >= TO_DATE('10/29/2014', 'MM/DD/YYYY') AND E.START_DATE <= TO_DATE('10/29/2016', 'MM/DD/YYYY'))
ELSE (E.CREATE_DATE >= TO_DATE('10/29/2014', 'MM/DD/YYYY') AND E.CREATE_DATE <= TO_DATE('10/29/2016', 'MM/DD/YYYY'))
END
GROUP BY E.EMPLOYEE_CATEGORY;

Я не очень хорошо знаком с Oracle или PLSQL, поэтому любая помощь, которую вы можете предоставить, будет высоко оценена!

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Я полагаю, у вас есть логика в обратном направлении.Это имеет гораздо больше смысла:

IF START_DATE IS NOT NULL:
    (E.START_DATE >= TO_DATE('10/29/2014', 'MM/DD/YYYY') AND E.START_DATE <= TO_DATE('10/29/2016', 'MM/DD/YYYY')
ELSE: 
    (E.CREATE_DATE >= TO_DATE('10/29/2014', 'MM/DD/YYYY') AND E.CREATE_DATE <= TO_DATE('10/29/2016', 'MM/DD/YYYY')

Затем вы можете просто выразить это как:

where (e.start_date >= date '2014-10-29' and e.start_date <= date '2016-10-29') or
      (e.start_date is null and e.create_date >= date '2014-10-29' and e.start_date <= date '2016-10-29')

Обратите внимание, что я упростил «константу даты» с помощью dateключевое слово, за которым следует стандартная дата ISO.

Это может быть еще более упрощено как:

where coalesce(e.start_date, e.create_date) >= date '2014-10-29' and
      coalesce(e.start_date, e.create_date) <= date '2016-10-29'

В общем, вы хотите избегать case в where предложениях, потому что базовый логическийвыражения обычно довольно просты для написания и понимания.Время использования case - это когда вы явно хотите упорядочить условия, особенно когда одно условие может быть дорогим вызовом функции.

0 голосов
/ 18 мая 2018

Используйте nvl так:

SELECT OC.DESCRIPTION "Description",
sum(S.AMOUNT) "SUM",
COUNT (DISTINCT(E.EMPLOYEE_NUM)) "Employee Nums"
FROM EMPLOYEES E
JOIN EMPLOYEE_SPENDING S ON S.EMPLOYEE_ID = E.EMPLOYEE_ID
WHERE E.EMPLOYEE_CATEGORY IN ('ACTIVE', 'INACTIVE')
AND ((nvl(E.START_DATE, e.create_date) >= TO_DATE('10/29/2014', 'MM/DD/YYYY') AND (nvl(E.START_DATE, e.create_date) <= TO_DATE('10/29/2016', 'MM/DD/YYYY'))
GROUP BY E.EMPLOYEE_CATEGORY;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...