Ini berkaitan dengan bagaimana dbms SQL menyelesaikan nama yang ambigu.
Saya belum melacak perilaku ini dalam standar SQL, tetapi tampaknya konsisten di seluruh platform. Inilah yang terjadi.
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" sebagai "col_2", dan gunakan alias dalam klausa ORDER BY. Dbms menyelesaikan "col_2" di ORDER BY sebagai alias untuk "col_1", dan mengurutkan berdasarkan nilai dalam "test"."col_1".
select col_1 as col_2
from test
order by col_2;
col_2 -- 1 2 3
Sekali lagi, alias "col_1" sebagai "col_2", tetapi gunakan ekspresi dalam klausa ORDER BY. Dbms menyelesaikan "col_2" tidak sebagai alias untuk "col_1", tetapi sebagai kolom "test"."col_2". Ini mengurutkan berdasarkan nilai dalam "test"."col_2".
select col_1 as col_2
from test
order by (col_2 || '');
col_2 -- 3 2 1
Jadi dalam kasus Anda, kueri Anda gagal karena dbms ingin menyelesaikan "Nilai Baru" dalam ekspresi sebagai nama kolom di tabel dasar. Tapi itu tidak; ini adalah alias kolom.
PostgreSQL
Perilaku ini didokumentasikan di PostgreSQL di bagian Mengurutkan Baris . Alasan mereka menyatakan adalah untuk mengurangi ambiguitas.
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
Kesalahan dokumentasi di SQL Server 2008
Sebuah sedikit masalah yang berbeda sehubungan dengan alias dalam ORDER klausa BY .
Kecuali saya tidak cukup berkafein, itu tidak benar sama sekali. Pernyataan ini diurutkan berdasarkan "test"."col_1" di SQL Server 2008 dan SQL Server 2012.
select col_1 as col_2
from test
order by col_1;