sql >> Database >  >> RDS >> Sqlserver

Waarom kan ik niet verwijzen naar een kolomalias in de ORDER BY met CASE?

Dit heeft te maken met hoe een SQL dbms dubbelzinnige namen oplost.

Ik heb dit gedrag nog niet opgespoord in de SQL-standaarden, maar het lijkt consistent te zijn op alle platforms. Dit is wat er gebeurt.

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" en gebruik de alias in de ORDER BY-clausule. De dbms lost "col_2" op in ORDER BY als een alias voor "col_1", en sorteert op de waarden in "test"."col_1".

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

Nogmaals, alias "col_1" als "col_2", maar gebruik een expressie in de ORDER BY-clausule. De dbms lost "col_2" niet op als een alias voor "col_1", maar als de kolom "test"."col_2". Het sorteert op de waarden in "test"."col_2".

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

Dus in uw geval mislukt uw query omdat de dbms "NewValue" in de expressie wil oplossen als een kolomnaam in een basistabel. Maar dat is het niet; het is een kolomalias.

PostgreSQL

Dit gedrag is gedocumenteerd in PostgreSQL in de sectie Rijen sorteren . Hun verklaarde reden is om ambiguïteit te verminderen.

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

Documentatiefout in SQL Server 2008

Een enigszins ander probleem met betrekking tot aliassen in de ORDER BY-clausule .

Tenzij ik onvoldoende cafeïne heb, is dat helemaal niet waar. Deze instructie sorteert op "test"."col_1" in zowel SQL Server 2008 als SQL Server 2012.

select col_1 as col_2
from test
order by col_1;


  1. Wanneer zal een correcte SQL een verkeerd resultaat opleveren?

  2. SQL Server-vergrendelingen en hun indicatie van prestatieproblemen

  3. SELECTEER alle records die 30 dagen oud zijn

  4. Hoe converteer ik een legacy left outer join-instructie in Oracle?