2011-04-20 62 views
5

Tôi hiểu rằng chuẩn SQL cho phép nhiều giá trị NULL trong một cột là một phần của ràng buộc UNIQUE.Trong PostgreSQL (và có thể các công cụ khác), tại sao câu lệnh UNION xem xét các giá trị NULL giống nhau, trong khi ràng buộc UNIQUE thì không?

Điều tôi không hiểu là tại sao cấu trúc UNION (ít nhất là trong PostgreSQL,) xử lý các giá trị NULL như nhau. Ví dụ:

$ select * from tmp_a; 
a | b 
---+--- 
a | b 
a | 
    | 
(3 rows) 

$ select * from tmp_b; 
a | b 
---+--- 
a | c 
a | 
    | 
(3 rows) 

$ select a, b from tmp_a union select a, b from tmp_b order by 1, 2; 
a | b 
---+--- 
a | b 
a | c 
a | 
    | 
(4 rows) 

Trả lời

1

Quy tắc chung trong Tiêu chuẩn SQL-92 như sau:

13.1 'tuyên bố con trỏ' (nhớ ORDER BY là một phần của một con trỏ) chung Rule 3b:

điều trị đặc biệt sau đây của giá trị null. Giá trị khóa phân loại có giá trị rỗng không được coi là lớn hơn hoặc nhỏ hơn giá trị không null là được xác định thực hiện, nhưng tất cả các loại giá trị khóa không có giá trị là được coi là lớn hơn tất cả giá trị không null hoặc được coi là ít hơn hơn tất cả các giá trị không null.

SQL-89 tuyên bố cùng một chút rõ ràng hơn IMO:

Mặc dù x = y không rõ nếu cả hai xyNULL giá trị, trong bối cảnh GROUP BY, ORDER BYDISTINCT , giá trị NULL là giống hệt hoặc trùng lặp với giá trị NULL khác.

Tôi đoán rằng PostgreSQL đang thực hiện sắp xếp để xóa các mục trùng lặp theo yêu cầu của UNION và nhóm các giá trị NULL cùng với Tiêu chuẩn.

2

tôi không thể tìm thấy một nguồn chủ yếu hơn, nhưng theo this Wikipedia article, có một trường hợp đặc biệt cho NULLs khi nói đến nhóm hoạt động. Đối với các hoạt động đó, như DISTINCT và UNION, NULL là "không phân biệt" với NULL, mặc dù hai NULL cũng "không bằng nhau".

1

Có một thú vị web page về điều này trên trang web SQLite với một khảo sát về sự khác biệt giữa các triển khai SQL.

1

Việc xử lý các giá trị rỗng trong SQL về cơ bản không nhất quán và đôi khi mâu thuẫn. Không có cơ sở âm thanh hợp lý nào sau hành vi của các null trong SQL. Bạn chỉ cần học các quy tắc khác nhau áp dụng ở những nơi khác nhau và áp dụng chúng hoặc làm việc xung quanh chúng.

Các vấn đề liên quan