簡體   English   中英

SQL / PLSQL Oracle查詢:WHERE語句中的CASE

[英]SQL/PLSQL Oracle query: CASE in WHERE statement

我正在嘗試查詢oracle數據庫,但無法完全使腳本正常工作。 該腳本是為了尋找員工提供一個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;

我的案例陳述看起來像這樣:

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不太熟悉,因此,您能提供的任何幫助將不勝感激!

提前致謝!

我相信您的邏輯倒退。 這更有意義:

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'

通常,您要避免在where子句中使用case ,因為基本的布爾表達式通常很容易編寫和理解。 case的時間是當您明確想要對條件進行排序時,尤其是當一個條件可能是昂貴的函數調用時。

像這樣使用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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM