Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi ne puis-je pas faire référence à un alias de colonne dans ORDER BY en utilisant CASE ?

Cela a à voir avec la façon dont une base de données SQL résout les noms ambigus.

Je n'ai pas encore suivi ce comportement dans les normes SQL, mais il semble être cohérent sur toutes les plates-formes. Voici ce qui se passe.

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" comme "col_2", et utilisez l'alias dans la clause ORDER BY. Le dbms résout "col_2" dans ORDER BY comme un alias pour "col_1", et trie par les valeurs dans "test"."col_1".

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

Encore une fois, alias "col_1" en tant que "col_2", mais utilisez une expression dans la clause ORDER BY. Le dbms résout "col_2" pas comme alias pour "col_1", mais comme colonne "test"."col_2". Il trie par les valeurs dans "test".."col_2".

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

Donc, dans votre cas, votre requête échoue car le dbms veut résoudre "NewValue" dans l'expression en tant que nom de colonne dans une table de base. Mais ce n'est pas; c'est un alias de colonne.

PostgreSQL

Ce comportement est documenté dans PostgreSQL dans la section Trier les lignes . Leur justification déclarée est de réduire l'ambiguïté.

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

Erreur de documentation dans SQL Server 2008

Un légèrement problème différent concernant les alias dans ORDER Clause BY .

Sauf si je suis insuffisamment caféiné, ce n'est pas vrai du tout. Cette instruction trie par "test"."col_1" dans SQL Server 2008 et SQL Server 2012.

select col_1 as col_2
from test
order by col_1;