Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tại sao tôi không thể tham chiếu đến bí danh cột trong ĐẶT HÀNG BẰNG CÁCH sử dụng CASE?

Đ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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm việc với các trường thập phân trong SSIS

  2. Vòng lặp if trong câu lệnh 'Then' của câu lệnh Case trong SQL Server 2008

  3. Trình kích hoạt Máy chủ lưu ở đâu trong SQL Server?

  4. SELECT max (x) trả về null; làm thế nào tôi có thể làm cho nó trả về 0?

  5. Các ký tự tối đa cho NVARCHAR (MAX) là bao nhiêu?