Điều này liên quan đến cách dbms SQL giải quyết các tên không rõ ràng.
Tôi vẫn chưa theo dõi hành vi này trong các tiêu chuẩn SQL, nhưng nó có vẻ nhất quán trên các nền tảng. Đây là những gì đang xảy ra.
create table test (
col_1 integer,
col_2 integer
);
insert into test (col_1, col_2) values
(1, 3),
(2, 2),
(3, 1);
Bí danh "col_1" là "col_2" và sử dụng bí danh trong mệnh đề ORDER BY. Các dbms phân giải "col_2" trong ORDER BY dưới dạng bí danh cho "col_1" và sắp xếp theo các giá trị trong "test". "Col_1".
select col_1 as col_2
from test
order by col_2;
col_2 -- 1 2 3
Một lần nữa, bí danh "col_1" là "col_2", nhưng sử dụng một biểu thức trong mệnh đề ORDER BY. Dbms giải quyết "col_2" không làm bí danh cho "col_1", nhưng là cột "test". "col_2". Nó sắp xếp theo các giá trị trong "test". "Col_2".
select col_1 as col_2
from test
order by (col_2 || '');
col_2 -- 3 2 1
Vì vậy, trong trường hợp của bạn, truy vấn của bạn không thành công vì dbms muốn giải quyết "NewValue" trong biểu thức dưới dạng tên cột trong bảng cơ sở. Nhưng nó không phải; đó là một bí danh của cột.
PostgreSQL
Hành vi này được ghi lại trong PostgreSQL trong phần Sắp xếp hàng . Cơ sở lý luận đã nêu của họ là để giảm sự mơ hồ.
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
Lỗi tài liệu trong SQL Server 2008
A hơi vấn đề khác liên quan đến bí danh trong ORDER Mệnh đề BY .
Trừ khi tôi không đủ caffein, điều đó hoàn toàn không đúng. Câu lệnh này sắp xếp theo "test". "Col_1" trong cả SQL Server 2008 và SQL Server 2012.
select col_1 as col_2
from test
order by col_1;