Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que não posso me referir a um alias de coluna no ORDER BY usando CASE?


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;