Dette har at gøre med, hvordan en SQL dbms løser tvetydige navne.
Jeg har endnu ikke sporet denne adfærd i SQL-standarderne, men den ser ud til at være konsistent på tværs af platforme. Her er, hvad der sker.
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", og brug aliaset i ORDER BY-sætningen. Dbms'en løser "col_2" i ORDER BY som et alias for "col_1", og sorterer efter værdierne i "test"."col_1".
select col_1 as col_2
from test
order by col_2;
col_2 -- 1 2 3
Igen, alias "col_1" som "col_2", men brug et udtryk i ORDER BY-sætningen. Dbms'en løser "col_2" ikke som et alias for "col_1", men som kolonnen "test"."col_2". Den sorterer efter værdierne i "test"."col_2".
select col_1 as col_2
from test
order by (col_2 || '');
col_2 -- 3 2 1
Så i dit tilfælde mislykkes din forespørgsel, fordi dbms ønsker at løse "NewValue" i udtrykket som et kolonnenavn i en basistabel. Men det er det ikke; det er et kolonnealias.
PostgreSQL
Denne adfærd er dokumenteret i PostgreSQL i afsnittet Sorteringsrækker . Deres erklærede begrundelse er at reducere tvetydighed.
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
Dokumentationsfejl i SQL Server 2008
En lidt andet problem med hensyn til aliaser i ORDEN BY-klausul .
Medmindre jeg er utilstrækkelig koffeinholdig, er det slet ikke sandt. Denne sætning sorteres efter "test"."col_1" i både SQL Server 2008 og SQL Server 2012.
select col_1 as col_2
from test
order by col_1;