Това е свързано с начина, по който 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;