在 where 子句中使用 Case 语句时 Oracle BIP 报告中缺少关键字错误 - Oracle fusion grants management query

问题描述 投票:0回答:1

我正在尝试使用 Oracle Cloud Fusion - 拨款管理中的 BI Publisher 报告提取一些奖项属性。我的查询包括一个需要算术计算并从那里转换为字符的字段,

我的BIP查询如下,

  SELECT
      GMS_AWDINFO.CONTRACT_NUMBER  AWARD_NUMBER
      ,GMS_AWDINFO.CONTRACT_NAME  AWARD_NAME
      ,GMS_AWDINFO.ATTRIBUTE2 BILL_TYPE
      ,GMS_AWDINFO.STS_CODE AWARD_STATUS
      ,TO_CHAR(GMS_AWDINFO.END_DATE,'MM/DD/YYYY') AS AWARD_END_DATE
      ,(CASE 
       WHEN to_date(GMS_AWDINFO.END_DATE, 'yyyy-mm-dd') - trunc(sysdate) > 30 
         THEN 'Over 30 Days'
       WHEN to_date(GMS_AWDINFO.END_DATE, 'yyyy-mm-dd') - trunc(sysdate) between 30 and 1  THEN 'Within 30 Days'
       WHEN to_date(GMS_AWDINFO.END_DATE, 'yyyy-mm-dd') - trunc(sysdate) < 1 THEN 'Expired'
       END) AS AWARD_EXPIRATION_STATUS  
  FROM 
      GMS_AWARD_HEADERS_INFO_V GMS_AWDINFO   
  WHERE   
      GMS_AWDINFO.CONTRACT_NUMBER IS NOT NULL
      AND (GMS_AWDINFO.CONTRACT_NUMBER IN (:P_AWARD_NUMBER) OR 'ALL' IN (:P_AWARD_NUMBER||'ALL'))
     AND (GMS_AWDINFO.STS_CODE IN (:P_AWARD_STATUS) OR 'ALL' IN (:P_AWARD_STATUS||'ALL'))
     AND  (
         CASE WHEN :P_EXPIRATION_STATUS = 'Over 30 Days' 
            THEN (to_date(GMS_AWDINFO.END_DATE, 'yyyy-mm-dd') - trunc(sysdate)) > 30
         
                 WHEN :P_EXPIRATION_STATUS = 'Within 30 Days' 
            THEN  (to_date(GMS_AWDINFO.END_DATE, 'yyyy-mm-dd') - trunc(sysdate)) between 30 and 1

                 ELSE (to_date(GMS_AWDINFO.END_DATE, 'yyyy-mm-dd') - trunc(sysdate))  < 1
                 END 
       )
     
  GROUP BY 
       GMS_AWDINFO.CONTRACT_NUMBER 
      ,GMS_AWDINFO.CONTRACT_NAME  
      ,GMS_AWDINFO.ATTRIBUTE2 
      ,GMS_AWDINFO.STS_CODE 
      ,GMS_AWDINFO.END_DATE

在我的where子句中,我需要传递参数

P_EXPIRATION_STATUS
变量,并且需要在where子句中计算后检查相应的值。

所以这里根据变量的值,需要进行计算后进行检查。我在 where 子句中添加了 case 语句。

但我越来越

ORA-00905: missing keyword
.

我刚刚开始使用 Oracle BIP 报告。那么有人可以建议或指导我解决这个问题吗?

或者我需要在这里使用任何不同的方法吗?

oracle bi-publisher oracle-fusion-apps
1个回答
0
投票

CASE
表达式返回标量值,它们不返回表达式。只需使用
AND
OR

SELECT CONTRACT_NUMBER AS AWARD_NUMBER
      ,CONTRACT_NAME AS AWARD_NAME
      ,ATTRIBUTE2 AS BILL_TYPE
      ,STS_CODE AS AWARD_STATUS
      ,TO_CHAR(END_DATE,'MM/DD/YYYY') AS AWARD_END_DATE
      ,CASE 
       WHEN TRUNC(END_DATE) - trunc(sysdate) > 30 
       THEN 'Over 30 Days'
       WHEN TRUNC(END_DATE) - trunc(sysdate) between 30 and 1
       THEN 'Within 30 Days'
       WHEN TRUNC(END_DATE) - trunc(sysdate) < 1
       THEN 'Expired'
       END AS AWARD_EXPIRATION_STATUS  
FROM   GMS_AWARD_HEADERS_INFO_V
WHERE  CONTRACT_NUMBER IS NOT NULL
AND    (  CONTRACT_NUMBER IN (:P_AWARD_NUMBER)
       OR 'ALL' IN (:P_AWARD_NUMBER||'ALL')
       )
AND    (  STS_CODE IN (:P_AWARD_STATUS)
       OR 'ALL' IN (:P_AWARD_STATUS||'ALL')
       )
AND    (
          (   :P_EXPIRATION_STATUS = 'Over 30 Days' 
          AND TRUNC(END_DATE) - trunc(sysdate) > 30
          )
       OR (   :P_EXPIRATION_STATUS = 'Within 30 Days' 
          AND TRUNC(END_DATE) - trunc(sysdate) between 30 and 1
          )
       OR (   :P_EXPIRATION_STATUS NOT IN ('Over 30 Days', 'Within 30 Days')
          AND TRUNC(END_DATE) - trunc(sysdate) < 1
          )
       )
GROUP BY 
       CONTRACT_NUMBER 
      ,CONTRACT_NAME  
      ,ATTRIBUTE2 
      ,STS_CODE 
      ,END_DATE
© www.soinside.com 2019 - 2025. All rights reserved.