Search code examples
sqloracle-databasestored-proceduresplsqlora-00904

How to use Alias in Where clause?


I have this procedure:

 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;

but SQL Developer generate this error:

Error(20,10): PL/SQL: ORA-00904: "EXPIRED_DATE": invalid identifier

I believe that PLSQL allows me to use Alias in Where clause, but is there something I forgot?

Thanks in advance.


Solution

  • You can't reference the column alias in the WHERE clause - your options are:

    • replicate the CASE statement in the WHERE clause
    • use a subquery:

      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;
      

      Oracle 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;