2014-01-30 59 views
0

這個Oracle查詢有什麼問題。我正在嘗試嵌套的表達式,但無法找到查詢失敗的原因。嵌套的case表達式在sql查詢中給出錯誤

SELECT USER_ID, 
ADVISER_FORENAME, 
ADVISER_SURNAME, 
AGENT_CODE, 
'[email protected]' AS EMAIL_ADDRESS, 
SUBMISSION_DATE, 
STATUS_CHANGED_DATE, 
CASE 
    WHEN (
    CASE 
     WHEN TO_CHAR(TRUNC(status_changed_date), 'DY')       IN ('fri','sat','sun') 
     THEN ((TRUNC(STATUS_CHANGED_DATE)    - (TRUNC(SUBMISSION_DATE)))>4) 
     ELSE ((TRUNC(STATUS_CHANGED_DATE)    - (TRUNC(SUBMISSION_DATE)))>6) 
    END) 
    THEN 'B' 
    ELSE 'A' 
END AS CATEGORY_CODE, 
PLAN_REF, 
PRODUCT_CODE, 
CASE 
    WHEN ((TRUNC(STATUS_CHANGED_DATE) - TRUNC(SUBMISSION_DATE))>4) 
    THEN 'IPP' 
    ELSE 'ICP' 
    END AS TOUCHPOINT_NAME 
FROM PIPELINE_PLAN 
WHERE STATUS            =26 
AND PRODUCT_TYPE           =1 
AND (TRUNC(STATUS_CHANGED_DATE) - TRUNC(SUBMISSION_DATE))<=4; 

當我嘗試運行,它提供了以下錯誤:

ORA-00907:缺少右括號 00907. 00000 - 「缺少右括號」 *原因:
*動作: 的錯誤線:53列:84

我檢查了缺少的括號,但沒有發現。

請幫忙。

回答

2

您嵌套的CASE s有點太聰明。在oracle中,比較(產生3路布爾結果TRUE/FALSE/UNKNOWN)和表達式(產生其他類型的值)是不可互換的。

CASE表達式的結果不是布爾值,所以它不能用作外部CASE中的WHEN的參數,它需要布爾值。

你有一個這樣的結構,在您的查詢:

CASE 
    WHEN (
    CASE 
     WHEN x IN ('1','2','3') 
     THEN (y>4) 
     ELSE (y>6) 
    END) 
    THEN 'B' 
    ELSE 'A' 
END 

需要被改寫爲

CASE 
    WHEN y > (CASE WHEN x IN ('1','2','3') THEN 4 ELSE 6 END) 
    THEN 'B' 
    ELSE 'A' 
END 

CASE 
    WHEN (x IN ('1','2','3') AND y>4) OR (x NOT IN ('1','2','3') AND y>6) 
    THEN 'B' 
    ELSE 'A' 
END 
0

我沒有看到一個問題圓括號,但是不能使用布爾值作爲的then子句中的結果。也許,這個版本將工作:

SELECT USER_ID, ADVISER_FORENAME, ADVISER_SURNAME, AGENT_CODE, 
     '[email protected]' AS EMAIL_ADDRESS, SUBMISSION_DATE, STATUS_CHANGED_DATE, 
     (CASE WHEN (TRUNC(STATUS_CHANGED_DATE) - TRUNC(SUBMISSION_DATE) > 4 and 
        TO_CHAR(TRUNC(status_changed_date), 'DY') IN ('fri','sat','sun') 
       ) or 
        (TRUNC(STATUS_CHANGED_DATE) - TRUNC(SUBMISSION_DATE) > 6 and 
        TO_CHAR(TRUNC(status_changed_date), 'DY') not IN ('fri','sat','sun') 
       ) 
      THEN 'B' 
      ELSE 'A' 
     END) AS CATEGORY_CODE, 
     PLAN_REF, PRODUCT_CODE, 
     (CASE WHEN TRUNC(STATUS_CHANGED_DATE) - TRUNC(SUBMISSION_DATE) > 4 
      THEN 'IPP' 
      ELSE 'ICP' 
     END) AS TOUCHPOINT_NAME 
FROM PIPELINE_PLAN 
WHERE STATUS = 26 AND PRODUCT_TYPE = 1 AND 
     TRUNC(STATUS_CHANGED_DATE) - TRUNC(SUBMISSION_DATE) <= 4; 

此外,基於對where條款,條件TRUNC(STATUS_CHANGED_DATE) - TRUNC(SUBMISSION_DATE) > 6永遠是正確的。