Oracle
 sql >> Base de données >  >> RDS >> Oracle

Utilisation d'un alias dans une clause WHERE

Ce n'est pas possible directement, car chronologiquement, WHERE se produit avant SELECT, qui est toujours la dernière étape de la chaîne d'exécution.

Vous pouvez faire une sous-sélection et filtrer dessus :

SELECT * FROM
(
  SELECT A.identifier
    , A.name
    , TO_NUMBER(DECODE( A.month_no
      , 1, 200803 
      , 2, 200804 
      , 3, 200805 
      , 4, 200806 
      , 5, 200807 
      , 6, 200808 
      , 7, 200809 
      , 8, 200810 
      , 9, 200811 
      , 10, 200812 
      , 11, 200701 
      , 12, 200702
      , NULL)) as MONTH_NO
    , TO_NUMBER(TO_CHAR(B.last_update_date, 'YYYYMM')) as UPD_DATE
  FROM table_a A
    , table_b B
  WHERE A.identifier = B.identifier
) AS inner_table
WHERE 
  MONTH_NO > UPD_DATE

Des informations intéressantes ont été extraites des commentaires :

Il ne devrait y avoir aucun impact sur les performances. Oracle n'a pas besoin de matérialiser les requêtes internes avant d'appliquer les conditions externes. Oracle envisagera de transformer cette requête en interne et de pousser le prédicat vers le bas dans la requête interne et le fera si cela est rentable. – Justin Cave