To souvisí s tím, jak SQL dbms řeší nejednoznačné názvy.
Dosud jsem toto chování ve standardech SQL nevysledoval, ale zdá se, že je konzistentní napříč platformami. Zde je to, co se děje.
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" jako "col_2" a použijte alias v klauzuli ORDER BY. dbms vyhodnotí "col_2" v ORDER BY jako alias pro "col_1" a seřadí podle hodnot v "test"."col_1".
select col_1 as col_2
from test
order by col_2;
col_2 -- 1 2 3
Opět alias "col_1" jako "col_2", ale použijte výraz v klauzuli ORDER BY. dbms řeší "col_2" ne jako alias pro "col_1", ale jako sloupec "test"."col_2". Seřadí se podle hodnot v "test"."col_2".
select col_1 as col_2
from test
order by (col_2 || '');
col_2 -- 3 2 1
Takže ve vašem případě váš dotaz selže, protože dbms chce vyřešit "NewValue" ve výrazu jako název sloupce v základní tabulce. Ale není; je to alias sloupce.
PostgreSQL
Toto chování je zdokumentováno v PostgreSQL v sekci Řazení řádků . Jejich uváděným zdůvodněním je snížit nejednoznačnost.
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
Chyba dokumentace v SQL Server 2008
A mírně jiný problém s aliasy v OBJEDNÁVCE klauzule BY .
Pokud nejsem nedostatečně kofeinovaný, tak to vůbec není pravda. Tento příkaz se řadí podle "test"."col_1" v SQL Server 2008 i SQL Server 2012.
select col_1 as col_2
from test
order by col_1;