Isso tem a ver com como um dbms SQL resolve nomes ambíguos.
Ainda não rastreei esse comportamento nos padrões SQL, mas parece ser consistente em todas as plataformas. Aqui está o que está acontecendo.
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" como "col_2" e use o alias na cláusula ORDER BY. O dbms resolve "col_2" no ORDER BY como um alias para "col_1" e classifica pelos valores em "test".."col_1".
select col_1 as col_2
from test
order by col_2;
col_2 -- 1 2 3
Novamente, alias "col_1" como "col_2", mas use uma expressão na cláusula ORDER BY. O dbms resolve "col_2" não como um alias para "col_1", mas como a coluna "test".."col_2". Classifica pelos valores em "test".."col_2".
select col_1 as col_2
from test
order by (col_2 || '');
col_2 -- 3 2 1
Portanto, no seu caso, sua consulta falha porque o dbms deseja resolver "NewValue" na expressão como um nome de coluna em uma tabela base. Mas isso não; é um alias de coluna.
PostgreSQL
Esse comportamento está documentado no PostgreSQL na seção Classificando linhas . Sua justificativa declarada é reduzir a ambiguidade.
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
Erro de documentação no SQL Server 2008
Um ligeiramente problema diferente com relação a aliases no PEDIDO Cláusula BY .
A menos que eu esteja insuficientemente cafeinado, isso não é verdade. Essa instrução classifica por "teste".."col_1" no SQL Server 2008 e no SQL Server 2012.
select col_1 as col_2
from test
order by col_1;