Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Защо не мога да се позова на псевдоним на колона в ORDER BY с CASE?

Това е свързано с начина, по който SQL dbms разрешава двусмислени имена.

Все още не съм проследил това поведение в SQL стандартите, но изглежда, че е последователно в различните платформи. Ето какво се случва.

create table test (
  col_1 integer,
  col_2 integer
);

insert into test (col_1, col_2) values 
(1, 3), 
(2, 2), 
(3, 1);

Псевдоним „col_1“ като „col_2“ и използвайте псевдонима в клаузата ORDER BY. Dbms разрешава "col_2" в ORDER BY като псевдоним за "col_1" и сортира по стойностите в "test"."col_1".

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

Отново, псевдоним "col_1" като "col_2", но използвайте израз в клаузата ORDER BY. Dbms разрешава "col_2" не като псевдоним за "col_1", но като колона "test"."col_2". Той сортира по стойностите в "test"."col_2".

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

Така че във вашия случай вашата заявка е неуспешна, защото dbms иска да разреши "NewValue" в израза като име на колона в базова таблица. Но не е; това е псевдоним на колона.

PostgreSQL

Това поведение е документирано в PostgreSQL в раздела Сортиране на редове . Тяхната заявена обосновка е да намалят неяснотата.

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

Грешка в документацията в SQL Server 2008

A леко различен проблем по отношение на псевдоними в ПОРЪЧКАТА клауза BY .

Освен ако не приемам достатъчно кофеин, това изобщо не е вярно. Този израз сортира по "test"."col_1" както в SQL Server 2008, така и в 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. SQL заявка за групиране по ден

  2. CLR:Multi Param Aggregate, аргументът не е в крайния изход?

  3. Как да използвам case оператор във функция със скаларни стойности в SQL?

  4. Базата данни „xxx“ не може да бъде отворена, защото е версия 904

  5. Създайте тригер след вмъкване