Detta har att göra med hur en SQL-dbms löser tvetydiga namn.
Jag har ännu inte spårat detta beteende i SQL-standarderna, men det verkar vara konsekvent på alla plattformar. Här är vad som händer.
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" som "col_2", och använd aliaset i ORDER BY-satsen. Dbms löser "col_2" i ORDER BY som ett alias för "col_1", och sorterar efter värdena i "test"."col_1".
select col_1 as col_2
from test
order by col_2;
col_2 -- 1 2 3
Återigen, alias "col_1" som "col_2", men använd ett uttryck i ORDER BY-satsen. Dbms löser "col_2" inte som ett alias för "col_1", men som kolumnen "test"."col_2". Den sorteras efter värdena i "test"."col_2".
select col_1 as col_2
from test
order by (col_2 || '');
col_2 -- 3 2 1
Så i ditt fall misslyckas din fråga eftersom dbms vill lösa "NewValue" i uttrycket som ett kolumnnamn i en bastabell. Men det är inte; det är ett kolumnalias.
PostgreSQL
Detta beteende dokumenteras i PostgreSQL i avsnittet Sorteringsrader . Deras uttalade motivering är att minska oklarheten.
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
Dokumentationsfel i SQL Server 2008
A något annat problem med avseende på alias i BESTÄLLNINGEN BY-klausul .
Om jag inte är otillräckligt koffeinhaltig är det inte alls sant. Denna sats sorteras efter "test"."col_1" i både SQL Server 2008 och SQL Server 2012.
select col_1 as col_2
from test
order by col_1;