Questo ha a che fare con il modo in cui un dbms SQL risolve i nomi ambigui.
Non ho ancora rintracciato questo comportamento negli standard SQL, ma sembra essere coerente su tutte le piattaforme. Ecco cosa sta succedendo.
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" come "col_2" e usa l'alias nella clausola ORDER BY. Il dbms risolve "col_2" in ORDER BY come alias per "col_1" e ordina in base ai valori in "test"."col_1".
select col_1 as col_2
from test
order by col_2;
col_2 -- 1 2 3
Di nuovo, alias "col_1" come "col_2", ma usa un'espressione nella clausola ORDER BY. Il dbms risolve "col_2" non come alias per "col_1", ma come colonna "test"."col_2". Ordina in base ai valori in "test"."col_2".
select col_1 as col_2
from test
order by (col_2 || '');
col_2 -- 3 2 1
Quindi nel tuo caso, la tua query non riesce perché il dbms vuole risolvere "NewValue" nell'espressione come nome di colonna in una tabella di base. Ma non lo è; è un alias di colonna.
PostgreSQL
Questo comportamento è documentato in PostgreSQL nella sezione Ordinamento delle righe . La loro logica dichiarata è di ridurre l'ambiguità.
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
Errore di documentazione in SQL Server 2008
Un leggermente problema diverso rispetto a alias nell'ORDINE BY clausola .
A meno che non sia sufficientemente caffeinato, non è affatto vero. Questa istruzione ordina per "test"."col_1" sia in SQL Server 2008 che in SQL Server 2012.
select col_1 as col_2
from test
order by col_1;