【问题标题】:How to use Alias in Where clause?如何在 Where 子句中使用别名?
【发布时间】:2011-04-20 15:37:26
【问题描述】:

我有这个程序:

 PROCEDURE P_LOAD_EXPIRED_ACCOUNT
  (
  pDayDiff IN NUMBER,
  ExpiredCur OUT MEGAGREEN_CUR
  )
  IS
  BEGIN
  OPEN ExpiredCur FOR
  SELECT 
  ACCOUNT_NAME, SERVICE_TYPE, 
      CASE 
      WHEN SERVICE_TYPE = 1 THEN ADD_MONTHS(ACTIVATED_DATE,3)
      WHEN SERVICE_TYPE = 2 THEN ADD_MONTHS(ACTIVATED_DATE,6)
      WHEN SERVICE_TYPE = 3 THEN ADD_MONTHS(ACTIVATED_DATE,12)        
       END 
       AS EXPIRED_DATE
  FROM SUBSCRIBERS
  WHERE (EXPIRED_DATE - CURRENT_DATE) < pDayDiff;
  END;

但是 SQL Developer 产生了这个错误:

错误(20,10):PL/SQL:ORA-00904:“EXPIRED_DATE”:标识符无效

我相信 PLSQL 允许我在 Where 子句中使用别名,但有什么我忘记了吗?

提前致谢。

【问题讨论】:

    标签: sql oracle stored-procedures plsql ora-00904


    【解决方案1】:

    您不能在 WHERE 子句中引用列别名 - 您的选择是:

    • 在 WHERE 子句中复制 CASE 语句
    • 使用子查询:

      PROCEDURE P_LOAD_EXPIRED_ACCOUNT(pDayDiff NUMBER,
                                       ExpiredCur OUT MEGAGREEN_CUR)
      IS
      BEGIN
      
      
         OPEN ExpiredCur FOR
         SELECT x.account_name,
                x.service_type, 
                x.expired_date
           FROM (SELECT s.account_name,
                        s.service_type, 
                        CASE 
                           WHEN s.service_type = 1 THEN ADD_MONTHS(ACTIVATED_DATE,3)
                           WHEN s.service_type = 2 THEN ADD_MONTHS(ACTIVATED_DATE,6)
                           WHEN s.service_type = 3 THEN ADD_MONTHS(ACTIVATED_DATE,12)        
                        END AS EXPIRED_DATE
                   FROM SUBSCRIBERS s) x
          WHERE x.expired_date - CURRENT_DATE < pDayDiff;
      
      
      END;
      

      甲骨文 9i+

      WITH summary AS (
        SELECT s.account_name,
               s.service_type, 
               CASE 
                  WHEN s.service_type = 1 THEN ADD_MONTHS(ACTIVATED_DATE,3)
                  WHEN s.service_type = 2 THEN ADD_MONTHS(ACTIVATED_DATE,6)
                  WHEN s.service_type = 3 THEN ADD_MONTHS(ACTIVATED_DATE,12)        
               END AS EXPIRED_DATE
          FROM SUBSCRIBERS s)
         SELECT x.account_name,
                x.service_type, 
                x.expired_date
           FROM summary x
          WHERE x.expired_date - CURRENT_DATE < pDayDiff;
      

    【讨论】:

      猜你喜欢
      • 2020-05-14
      • 2010-09-26
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多