Обращение к столбцу в предикате WHERE по псевдониму

Задача

Допустим, что именам столбцов результирующего множества присваиваются псевдонимы, чтобы сделать их более понятными и содержательными. Требуется исключить некоторые из строк с помощью предиката WHERE. Однако при сиспользовании псевдонимов в предикате WHERE возникает ошибка.

select e.sal as salary, e.comm as commission
from emp e
where salary < 5000


Error starting at line 1 in command:
select e.sal as salary, e.comm as commission
from emp e
where salary < 5000
Error at Command Line:3 Column:7
Error report:
SQL Error: ORA-00904: "SALARY": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:
*Action:

Решение

Чтобы обратиться к столбцу по псевдониму, необходимо использовать вложенный запрос:

select x.*
from (
      select e.sal as salary, e.comm as commission
      from emp e
      ) x
where salary < 5000

В данном случае x - это результат выполнения внутреннего запроса.

SALARY COMMISSION
------ ----------
   800
  1600        300
  1250        500
  2975
  1250       1400
  2850
  2450
  3000
  1500          0
  1100
   950
  3000
  1300

 13 rows selected


Обсуждение

В этом простом примере можно не прибегать к вложенному запросу, а в предикате WHERE напрямую обратиться к столбцам по их именам, COMM или SAL. Результат будет такой же. Данный пример показывает принципы использования в предикате WHERE следующих элементов языка:

  • Агрегатных функций
  • Скалярных подзапросов
  • Оконных функций
  • Псевдонимов

Использование вложенного запроса, присваивающего псевдонимы, дает возможность обращаться к столбцам по псевдонимам во внешенм запросе. Почему это необходимо? Предикат WHERE обрабатывается раньше оператора SELECT; таким образом, на момент обработки WHERE в запросе, приведенном в разделе “Задача”, столбцов SALARY и COMMISSION еще не существует. Эти псевдонимы присваиваются уже после обработки WHERE. А вот оператор FROM выполняется до предиката WHERE. Размещение исходного запроса в операторе FROM обеспечивает формирование его результатов до обработки самого внешнего WHERE, следовательно, этот предикат WHERE будет “видеть” псевдонимы. Данна техника очень полезна в случае, если при выводе результатов зарпоса требуется менять имена столбцов таблицы.