Dit heeft te maken met hoe een SQL dbms dubbelzinnige namen oplost.
Ik heb dit gedrag nog niet opgespoord in de SQL-standaarden, maar het lijkt consistent te zijn op alle platforms. Dit is wat er gebeurt.
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" en gebruik de alias in de ORDER BY-clausule. De dbms lost "col_2" op in ORDER BY als een alias voor "col_1", en sorteert op de waarden in "test"."col_1".
select col_1 as col_2
from test
order by col_2;
col_2 -- 1 2 3
Nogmaals, alias "col_1" als "col_2", maar gebruik een expressie in de ORDER BY-clausule. De dbms lost "col_2" niet op als een alias voor "col_1", maar als de kolom "test"."col_2". Het sorteert op de waarden in "test"."col_2".
select col_1 as col_2
from test
order by (col_2 || '');
col_2 -- 3 2 1
Dus in uw geval mislukt uw query omdat de dbms "NewValue" in de expressie wil oplossen als een kolomnaam in een basistabel. Maar dat is het niet; het is een kolomalias.
PostgreSQL
Dit gedrag is gedocumenteerd in PostgreSQL in de sectie Rijen sorteren . Hun verklaarde reden is om ambiguïteit te verminderen.
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
Documentatiefout in SQL Server 2008
Een enigszins ander probleem met betrekking tot aliassen in de ORDER BY-clausule .
Tenzij ik onvoldoende cafeïne heb, is dat helemaal niet waar. Deze instructie sorteert op "test"."col_1" in zowel SQL Server 2008 als SQL Server 2012.
select col_1 as col_2
from test
order by col_1;