Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum kann ich in ORDER BY nicht mit CASE auf einen Spaltenalias verweisen?

Das hat damit zu tun, wie ein SQL-DBMS mehrdeutige Namen auflöst.

Ich habe dieses Verhalten in den SQL-Standards noch nicht aufgespürt, aber es scheint plattformübergreifend konsistent zu sein. Hier ist, was passiert.

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" als "col_2", und verwenden Sie den Alias ​​in der ORDER BY-Klausel. Das dbms löst „col_2“ in ORDER BY als Alias ​​für „col_1“ auf und sortiert nach den Werten in „test“. „col_1“.

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

Auch hier Alias ​​"col_1" als "col_2", aber verwenden Sie einen Ausdruck in der ORDER BY-Klausel. Das dbms löst "col_2" nicht auf als Alias ​​für "col_1", sondern als Spalte "test"."col_2". Es sortiert nach den Werten in "test"."col_2".

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

In Ihrem Fall schlägt Ihre Abfrage also fehl, weil das DBMS "NewValue" im Ausdruck als Spaltennamen in einer Basistabelle auflösen möchte. Aber es ist nicht; es ist ein Spaltenalias.

PostgreSQL

Dieses Verhalten ist in PostgreSQL im Abschnitt Zeilen sortieren dokumentiert . Ihr erklärtes Grundprinzip besteht darin, Mehrdeutigkeiten zu reduzieren.

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

Dokumentationsfehler in SQL Server 2008

A leicht anderes Problem in Bezug auf Aliase in der ORDER BY-Klausel .

Es sei denn, ich habe nicht genug Koffein, das stimmt überhaupt nicht. Diese Anweisung sortiert sowohl in SQL Server 2008 als auch in SQL Server 2012 nach "test"."col_1".

select col_1 as col_2
from test
order by col_1;