sql >> Databáze >  >> RDS >> Sqlserver

Proč nemohu odkazovat na alias sloupce v ORDER BY pomocí CASE?

To souvisí s tím, jak SQL dbms řeší nejednoznačné názvy.

Dosud jsem toto chování ve standardech SQL nevysledoval, ale zdá se, že je konzistentní napříč platformami. Zde je to, co se děje.

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" a použijte alias v klauzuli ORDER BY. dbms vyhodnotí "col_2" v ORDER BY jako alias pro "col_1" a seřadí podle hodnot v "test"."col_1".

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

Opět alias "col_1" jako "col_2", ale použijte výraz v klauzuli ORDER BY. dbms řeší "col_2" ne jako alias pro "col_1", ale jako sloupec "test"."col_2". Seřadí se podle hodnot v "test"."col_2".

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

Takže ve vašem případě váš dotaz selže, protože dbms chce vyřešit "NewValue" ve výrazu jako název sloupce v základní tabulce. Ale není; je to alias sloupce.

PostgreSQL

Toto chování je zdokumentováno v PostgreSQL v sekci Řazení řádků . Jejich uváděným zdůvodněním je snížit nejednoznačnost.

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

Chyba dokumentace v SQL Server 2008

A mírně jiný problém s aliasy v OBJEDNÁVCE klauzule BY .

Pokud nejsem nedostatečně kofeinovaný, tak to vůbec není pravda. Tento příkaz se řadí podle "test"."col_1" v SQL Server 2008 i SQL Server 2012.

select col_1 as col_2
from test
order by col_1;


  1. 7 způsobů, jak zkontrolovat verzi Oracle

  2. Rozdíl ve zpracování mezer mezi Oracle a SQL Server

  3. Žádné jedinečné nebo vyloučení omezení neodpovídá ON CONFLICT

  4. Jak vypustit tabulku v SQL