sql >> Databasteknik >  >> RDS >> Sqlserver

Varför kan jag inte referera till ett kolumnalias i ORDER BY using CASE?

Detta har att göra med hur en SQL-dbms löser tvetydiga namn.

Jag har ännu inte spårat detta beteende i SQL-standarderna, men det verkar vara konsekvent på alla plattformar. Här är vad som händer.

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" som "col_2", och använd aliaset i ORDER BY-satsen. Dbms löser "col_2" i ORDER BY som ett alias för "col_1", och sorterar efter värdena i "test"."col_1".

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

Återigen, alias "col_1" som "col_2", men använd ett uttryck i ORDER BY-satsen. Dbms löser "col_2" inte som ett alias för "col_1", men som kolumnen "test"."col_2". Den sorteras efter värdena i "test"."col_2".

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

Så i ditt fall misslyckas din fråga eftersom dbms vill lösa "NewValue" i uttrycket som ett kolumnnamn i en bastabell. Men det är inte; det är ett kolumnalias.

PostgreSQL

Detta beteende dokumenteras i PostgreSQL i avsnittet Sorteringsrader . Deras uttalade motivering är att minska oklarheten.

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

Dokumentationsfel i SQL Server 2008

A något annat problem med avseende på alias i BESTÄLLNINGEN BY-klausul .

Om jag inte är otillräckligt koffeinhaltig är det inte alls sant. Denna sats sorteras efter "test"."col_1" i både SQL Server 2008 och SQL Server 2012.

select col_1 as col_2
from test
order by col_1;


  1. Karta Guid Property till Oracle i Entity Framework Code först

  2. ClusterControl - Advanced Backup Management - mariabackup del I

  3. MYSQL okänd klausul join kolumn i nästa join

  4. Vad är skillnaden mellan en primärnyckel och en surrogatnyckel?