Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché non posso fare riferimento a un alias di colonna in ORDER BY utilizzando CASE?

Questo ha a che fare con il modo in cui un dbms SQL risolve i nomi ambigui.

Non ho ancora rintracciato questo comportamento negli standard SQL, ma sembra essere coerente su tutte le piattaforme. Ecco cosa sta succedendo.

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" come "col_2" e usa l'alias nella clausola ORDER BY. Il dbms risolve "col_2" in ORDER BY come alias per "col_1" e ordina in base ai valori in "test"."col_1".

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

Di nuovo, alias "col_1" come "col_2", ma usa un'espressione nella clausola ORDER BY. Il dbms risolve "col_2" non come alias per "col_1", ma come colonna "test"."col_2". Ordina in base ai valori in "test"."col_2".

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

Quindi nel tuo caso, la tua query non riesce perché il dbms vuole risolvere "NewValue" nell'espressione come nome di colonna in una tabella di base. Ma non lo è; è un alias di colonna.

PostgreSQL

Questo comportamento è documentato in PostgreSQL nella sezione Ordinamento delle righe . La loro logica dichiarata è di ridurre l'ambiguità.

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

Errore di documentazione in SQL Server 2008

Un leggermente problema diverso rispetto a alias nell'ORDINE BY clausola .

A meno che non sia sufficientemente caffeinato, non è affatto vero. Questa istruzione ordina per "test"."col_1" sia in SQL Server 2008 che in SQL Server 2012.

select col_1 as col_2
from test
order by col_1;