How to use Alias in Where clause?

后端 未结 1 1219
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-21 06:59

I have this procedure:

 PROCEDURE P_LOAD_EXPIRED_ACCOUNT
  (
  pDayDiff IN NUMBER,
  ExpiredCur OUT MEGAGREEN_CUR
  )
  IS
  BEGIN
  OPEN ExpiredCur FOR
  SE         


        
1条回答
  •  有刺的猬
    2020-12-21 07:37

    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;
      

    0 讨论(0)
提交回复
热议问题