Ma to związek ze sposobem, w jaki dbm SQL rozwiązuje niejednoznaczne nazwy.
Nie wyśledziłem jeszcze tego zachowania w standardach SQL, ale wydaje się, że jest ono spójne na różnych platformach. Oto, co się dzieje.
create table test (
col_1 integer,
col_2 integer
);
insert into test (col_1, col_2) values
(1, 3),
(2, 2),
(3, 1);
Alias „col_1” jako „col_2” i użyj aliasu w klauzuli ORDER BY. DBms rozwiązuje „col_2” w ORDER BY jako alias „col_1” i sortuje według wartości w „test”.”col_1”.
select col_1 as col_2
from test
order by col_2;
col_2 -- 1 2 3
Ponownie alias „kol_1” jako „kol_2”, ale użyj wyrażenia w klauzuli ORDER BY. DBms rozwiązuje „col_2” nie jako alias dla „col_1”, ale jako kolumna „test”. „col_2”. Sortuje według wartości w "test"."col_2".
select col_1 as col_2
from test
order by (col_2 || '');
col_2 -- 3 2 1
Tak więc w Twoim przypadku zapytanie kończy się niepowodzeniem, ponieważ dbms chce rozwiązać „NowaWartość” w wyrażeniu jako nazwę kolumny w tabeli podstawowej. Ale nie jest; to alias kolumny.
PostgreSQL
To zachowanie jest udokumentowane w PostgreSQL w sekcji Sortowanie wierszy . Podane przez nich uzasadnienie polega na zmniejszeniu niejednoznaczności.
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
Błąd dokumentacji w SQL Server 2008
nieco inny problem w odniesieniu do aliasów w ZAMÓWIENIU Klauzula BY .
O ile nie mam dostatecznej ilości kofeiny, to wcale nie jest prawda. Ta instrukcja jest sortowana według "test"."col_1" zarówno w SQL Server 2008, jak i SQL Server 2012.
select col_1 as col_2
from test
order by col_1;