【问题标题】:Nested case expression gives error in sql query嵌套 case 表达式在 sql 查询中给出错误
【发布时间】:2014-01-30 01:31:50
【问题描述】:

这个 Oracle 查询有什么问题。我正在尝试嵌套 case 表达式,但找不到查询失败的原因。

SELECT USER_ID,
ADVISER_FORENAME,
ADVISER_SURNAME,
AGENT_CODE,
'ABC@WIPRO.COM' 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

我检查了是否缺少括号,但没有找到。

请帮忙。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您嵌套的CASEs 有点太聪明了。在 oracle 中,比较(产生 3 路布尔结果 TRUE/FALSE/UNKNOWN)和表达式(产生其他类型的值)是不可互换的。

    CASE 表达式的结果不是布尔值,因此它不能用作外部CASEWHEN 的参数,这需要布尔值。

    您的查询中有这样的结构:

    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
    

    【讨论】:

      【解决方案2】:

      我看不出括号有问题,但您不能在casethen 子句中使用布尔值作为结果。也许这个版本可以工作:

      SELECT USER_ID, ADVISER_FORENAME, ADVISER_SURNAME, AGENT_CODE,
             'ABC@WIPRO.COM' 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) &gt; 6 永远不会为真。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-06
        • 2019-12-07
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多