Псевдоним столбца в выражении `ORDER BY`? - PullRequest
0 голосов
/ 17 февраля 2020

В Oracle 12.1.0.2 и Oracle 19 c, этот запрос:

with test_data (c1, c2) AS (
SELECT 'A', 1 FROM DUAL UNION ALL
SELECT 'B', 2 FROM DUAL UNION ALL
SELECT 'C', 3 FROM DUAL )
SELECT c1, c2*-1 c2
FROM test_data
order by c2*-1;

Возвращает:

+----+----+
| C1 | C2 |
+----+----+
| A  | -1 |
| B  | -2 |
| C  | -3 |
+----+----+

В других словами, c2 в ORDER BY c2*-1 относится к псевдониму столбца c2 в списке SELECT, а НЕ к столбцу c2 в таблице базы данных.

Мое чтение Oracle SQL Справочное руководство заставляет меня думать, что приведенный выше результат запроса неверен и что Oracle не следует думать, что идентификатор в выражении ORDER BY ссылается на псевдоним столбца.

* * * * * * * Oracle всегда вел себя так, и я просто никогда не замечал? Есть ли в документации Oracle что-то, указывающее, что приведенные выше результаты верны и ожидаемы?

1 Ответ

3 голосов
/ 17 февраля 2020

Документация кажется мне вполне понятной:

expr

строк заказов expr на основе их значения для expr. Выражение основано на столбцах в списке выбора или столбцах в таблицах, представлениях или материализованных представлениях в предложении FROM.

На самом деле оно сначала ссылается на «столбцы» в списке выбора (с помощью которого это означает псевдонимы).

Если вы хотите столбец таблицы, используйте псевдоним:

order by test_data.c2 * -1
...