Обращение к столбцу в предикате 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 будет “видеть” псевдонимы. Данна техника очень полезна в случае, если при выводе результатов зарпоса требуется менять имена столбцов таблицы.