sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué no puedo referirme a un alias de columna en ORDER BY usando CASE?

Esto tiene que ver con la forma en que SQL dbms resuelve los nombres ambiguos.

Todavía no he rastreado este comportamiento en los estándares de SQL, pero parece ser consistente en todas las plataformas. Esto es lo que está pasando.

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", y use el alias en la cláusula ORDER BY. El dbms resuelve "col_2" en ORDER BY como un alias para "col_1" y ordena por los valores en "test"."col_1".

select col_1 as col_2
from test
order by col_2;
col_2
--
1
2
3

Nuevamente, alias "col_1" como "col_2", pero use una expresión en la cláusula ORDER BY. El dbms resuelve "col_2" no como un alias para "col_1", sino como la columna "test"."col_2". Ordena por los valores en "test"."col_2".

select col_1 as col_2
from test
order by (col_2 || '');
col_2
--
3
2
1

Entonces, en su caso, su consulta falla porque el dbms quiere resolver "NewValue" en la expresión como un nombre de columna en una tabla base. Pero no lo es; es un alias de columna.

PostgreSQL

Este comportamiento está documentado en PostgreSQL en la sección Ordenar filas . Su justificación declarada es reducir la ambigüedad.

SELECT a + b AS sum, c FROM table1 ORDER BY sum + c;          -- wrong

Error de documentación en SQL Server 2008

Un ligeramente Problema diferente con respecto a alias en ORDER Cláusula BY .

A menos que no tenga suficiente cafeína, eso no es cierto en absoluto. Esta instrucción ordena por "prueba"."col_1" tanto en SQL Server 2008 como en SQL Server 2012.

select col_1 as col_2
from test
order by col_1;