Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego nie mogę odwołać się do aliasu kolumny w ORDER BY używając CASE?

Ma to związek ze sposobem, w jaki dbm SQL rozwiązuje niejednoznaczne nazwy.

Nie wyśledziłem jeszcze tego zachowania w standardach SQL, ale wydaje się, że jest ono spójne na różnych platformach. Oto, co się dzieje.

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” jako „col_2” i użyj aliasu w klauzuli ORDER BY. DBms rozwiązuje „col_2” w ORDER BY jako alias „col_1” i sortuje według wartości w „test”.”col_1”.

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

Ponownie alias „kol_1” jako „kol_2”, ale użyj wyrażenia w klauzuli ORDER BY. DBms rozwiązuje „col_2” nie jako alias dla „col_1”, ale jako kolumna „test”. „col_2”. Sortuje według wartości w "test"."col_2".

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

Tak więc w Twoim przypadku zapytanie kończy się niepowodzeniem, ponieważ dbms chce rozwiązać „NowaWartość” w wyrażeniu jako nazwę kolumny w tabeli podstawowej. Ale nie jest; to alias kolumny.

PostgreSQL

To zachowanie jest udokumentowane w PostgreSQL w sekcji Sortowanie wierszy . Podane przez nich uzasadnienie polega na zmniejszeniu niejednoznaczności.

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

Błąd dokumentacji w SQL Server 2008

nieco inny problem w odniesieniu do aliasów w ZAMÓWIENIU Klauzula BY .

O ile nie mam dostatecznej ilości kofeiny, to wcale nie jest prawda. Ta instrukcja jest sortowana według "test"."col_1" zarówno w SQL Server 2008, jak i SQL Server 2012.

select col_1 as col_2
from test
order by col_1;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak znaleźć najwolniejsze zapytania

  2. Jak napisać zapytanie, aby wyodrębnić poszczególne zmiany z migawek danych?

  3. Porównaj wartość wielu kolumn z dwóch różnych baz danych

  4. Zapytanie o pola daty i godziny z milisekundami daje zły wynik w SQL Server

  5. Dołączanie do rekordu daty MAX w grupie