Das hat damit zu tun, wie ein SQL-DBMS mehrdeutige Namen auflöst.
Ich habe dieses Verhalten in den SQL-Standards noch nicht aufgespürt, aber es scheint plattformübergreifend konsistent zu sein. Hier ist, was passiert.
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" als "col_2", und verwenden Sie den Alias in der ORDER BY-Klausel. Das dbms löst „col_2“ in ORDER BY als Alias für „col_1“ auf und sortiert nach den Werten in „test“. „col_1“.
select col_1 as col_2
from test
order by col_2;
col_2 -- 1 2 3
Auch hier Alias "col_1" als "col_2", aber verwenden Sie einen Ausdruck in der ORDER BY-Klausel. Das dbms löst "col_2" nicht auf als Alias für "col_1", sondern als Spalte "test"."col_2". Es sortiert nach den Werten in "test"."col_2".
select col_1 as col_2
from test
order by (col_2 || '');
col_2 -- 3 2 1
In Ihrem Fall schlägt Ihre Abfrage also fehl, weil das DBMS "NewValue" im Ausdruck als Spaltennamen in einer Basistabelle auflösen möchte. Aber es ist nicht; es ist ein Spaltenalias.
PostgreSQL
Dieses Verhalten ist in PostgreSQL im Abschnitt Zeilen sortieren dokumentiert . Ihr erklärtes Grundprinzip besteht darin, Mehrdeutigkeiten zu reduzieren.
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
Dokumentationsfehler in SQL Server 2008
A leicht anderes Problem in Bezug auf Aliase in der ORDER BY-Klausel .
Es sei denn, ich habe nicht genug Koffein, das stimmt überhaupt nicht. Diese Anweisung sortiert sowohl in SQL Server 2008 als auch in SQL Server 2012 nach "test"."col_1".
select col_1 as col_2
from test
order by col_1;