sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor kan jeg ikke henvise til et kolonnealias i ORDER BY using CASE?

Dette har at gøre med, hvordan en SQL dbms løser tvetydige navne.

Jeg har endnu ikke sporet denne adfærd i SQL-standarderne, men den ser ud til at være konsistent på tværs af platforme. Her er, hvad der sker.

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", og brug aliaset i ORDER BY-sætningen. Dbms'en løser "col_2" i ORDER BY som et alias for "col_1", og sorterer efter værdierne i "test"."col_1".

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

Igen, alias "col_1" som "col_2", men brug et udtryk i ORDER BY-sætningen. Dbms'en løser "col_2" ikke som et alias for "col_1", men som kolonnen "test"."col_2". Den sorterer efter værdierne i "test"."col_2".

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

Så i dit tilfælde mislykkes din forespørgsel, fordi dbms ønsker at løse "NewValue" i udtrykket som et kolonnenavn i en basistabel. Men det er det ikke; det er et kolonnealias.

PostgreSQL

Denne adfærd er dokumenteret i PostgreSQL i afsnittet Sorteringsrækker . Deres erklærede begrundelse er at reducere tvetydighed.

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

Dokumentationsfejl i SQL Server 2008

En lidt andet problem med hensyn til aliaser i ORDEN BY-klausul .

Medmindre jeg er utilstrækkelig koffeinholdig, er det slet ikke sandt. Denne sætning sorteres efter "test"."col_1" i både SQL Server 2008 og SQL Server 2012.

select col_1 as col_2
from test
order by col_1;


  1. Hvordan konverteres billede til byte array kun ved hjælp af javascript for at gemme billede på sql server?

  2. MySQL - Count og GroupBy

  3. JTabelkolonnenavne udskrives ikke

  4. Ja, en anden MySql:FEJL 1045 (28000):Adgang nægtet for brugeren 'root'@'localhost' (ved hjælp af adgangskode:JA)