2014-01-30 63 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永远是正确的。