2012-10-04 37 views
10

Tôi hiểu tại saonull + 1 hoặc (1 + null) trả null: null có nghĩa là "giá trị không rõ", và nếu một giá trị là không rõ, người kế nhiệm của nó là chưa biết là tốt. Điều này cũng đúng đối với hầu hết các hoạt động khác liên quan đến vô [*]Tại sao SUM (...) trên một bản ghi trống rỗng trả về NULL thay vì 0?

Tuy nhiên, tôi không hiểu lý do tại sao sau xảy ra:.

SELECT SUM(someNotNullableIntegerField) FROM someTable WHERE 1=0 

truy vấn này trả null. Tại sao? Không có giá trị không xác định có liên quan ở đây! Mệnh đề WHERE trả về các bản ghi không và tổng của một tập hợp giá trị trống là 0. [**] Lưu ý rằng tập hợp không phải là không rõ, là được biết là trống.

Tôi biết rằng tôi có thể giải quyết hành vi này bằng cách sử dụng ISNULL hoặc COALESCE, nhưng tôi đang cố gắng hiểu lý do tại sao hành vi này, có vẻ phản trực giác với tôi.

Bất kỳ thông tin chi tiết nào về lý do tại sao điều này có ý nghĩa?


[*] với một số trường hợp ngoại lệ đáng chú ý như null OR true, nơi rõ ràng true là kết quả ngay vì giá trị chưa biết đơn giản là không quan trọng.

[**] giống như sản phẩm của một tập hợp giá trị trống là 1. Về mặt toán học, nếu tôi mở rộng $ (Z, +) $ thành $ (Z union {null}, +) $, lựa chọn hiển nhiên cho phần tử nhận dạng vẫn là 0, không phải null, kể từ x + 0 = x nhưng x + null = null.

+0

Có lẽ bởi vì bạn đang sử dụng một tổng thể. – Kermit

+0

Khi bạn thêm không có gì bạn không nhận được 0, bạn sẽ không nhận được gì. –

+0

Bạn đã xem xét kế hoạch thực hiện chưa? – Kermit

Trả lời

9

ANSI-SQL-Standard xác định kết quả của SUM của một tập rỗng như NULL. Tại sao họ đã làm điều này, tôi không thể nói, nhưng ít nhất là hành vi phải nhất quán trên tất cả các công cụ cơ sở dữ liệu.

tham khảo: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt trên trang 126:

b) Nếu AVG, MAX, MIN, hoặc SUM được chỉ định, sau đó

  Case: 

     i) If TXA is empty, then the result is the null value. 

TXA là resultset tác từ cột được lựa chọn .

+0

Tôi nghĩ đây là sự nhất quán, vì giá trị hợp lý duy nhất của 'AVG',' MIN', 'MAX', vì vậy tôi đoán họ đã quyết định không làm cho' SUM' trở thành một trường hợp đặc biệt. Trường hợp đặc biệt duy nhất là 'COUNT'. Xấu hổ tiêu chuẩn không bao gồm lý trí đằng sau nó. –

+1

Tôi đã bắt đầu [một câu hỏi trên dba.stackexchange.com] (http://dba.stackexchange.com/q/25435/5273) về * lý do tại sao * nó đã được standarized theo cách này. – Heinzi

0

Khi bạn ngụ ý bảng trống, bạn có nghĩa là một bảng chỉ có giá trị NULL, Đó là lý do tại sao chúng tôi sẽ nhận được NULL làm đầu ra cho các hàm tổng hợp. Bạn có thể xem xét điều này như thiết kế cho SQL Server.

Ví dụ 1

CREATE TABLE testSUMNulls 
(
    ID TINYINT 
) 
GO 

INSERT INTO testSUMNulls (ID) VALUES (NULL),(NULL),(NULL),(NULL) 

SELECT SUM(ID) FROM testSUMNulls 

Ví dụ 2

CREATE TABLE testSumEmptyTable 
(
    ID TINYINT 
) 
GO 

SELECT SUM(ID) Sums FROM testSumEmptyTable 

Trong cả hai ví dụ bạn sẽ NULL như đầu ra ..

+2

'Khi bạn có nghĩa là bảng trống bạn có nghĩa là một bảng chỉ có giá trị NULL,' ... nope, chắc chắn là không. – Heinzi

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