2009-11-19 26 views
10

tôi thấy đoạn này của SQL trong một cái nhìn và tôi khá bối rối bởi mục đích của nó (thực tế SQL rút ngắn cho ngắn gọn):liên hiệp với NULL

SELECT 
    COALESCE(b.Foo, NULL) AS Foo 

FROM a 
LEFT JOIN b ON b.aId=a.Id 

Tôi không thể nghĩ ra một lý do duy nhất về mục đích của coalescing với null thay vì chỉ làm điều này:

SELECT 
    b.Foo AS Foo 

FROM a 
LEFT JOIN b ON b.aId=a.Id 

Hoặc ít nhất không bao gồm NULL một cách rõ ràng:

SELECT 
    COALESCE(b.Foo) AS Foo 

FROM a 
LEFT JOIN b ON b.aId=a.Id 

Tôi không biết ai là tác giả (vì vậy tôi không thể hỏi), khi nó được tác giả, hoặc cho phiên bản MS SQL Server cụ thể được viết cho (trước năm 2008 chắc chắn).

Có lý do hợp lệ nào để kết hợp với NULL thay vì chỉ chọn cột trực tiếp không? Tôi không thể không cười và viết nó như là một sai lầm tân binh nhưng nó làm cho tôi tự hỏi nếu có một số "trường hợp rìa" mà tôi không biết.

+2

Có vẻ như một sai lầm tân binh đối với tôi. –

+4

Hoặc yêu cầu đã thay đổi nhiều lần, vì vậy truy vấn này đã được các nhà phát triển khác nhau sửa đổi nhiều lần. Có thể COALESCE (b.Foo, NULL) là COALESCE (b.Foo, [một số giá trị/biểu thức]) trước đây. Sau đó, yêu cầu đã thay đổi. Vì vậy, ai đó chỉ cần thay đổi thành COALESCE (b.Foo, NULL) mà không cần suy nghĩ. – David

+0

Điều này có thể là một cách hacky để kích hoạt một lỗi nếu b.Foo là NULL. Cho dù đó là hợp lệ hay không là một câu hỏi khác. – Mike

Trả lời

11

Bạn đang đúng - không có lý do để sử dụng:

SELECT COALESCE(b.Foo, NULL) 

... bởi vì nếu b.foo là NULL, bạn cũng có thể chỉ cần sử dụng:

SELECT b.foo 

... giả định rằng bạn muốn để biết giá trị có phải là không.

4

Tôi nghĩ rằng có thể là một trường hợp cạnh, nhưng nó là rất tích lịch sử - đó là một chút của một đoán nhưng nó có thể bao quanh tình hình nơi b.foo = '' ví dụ một chuỗi các khoảng trắng.

Quay trở lại đủ xa trong SQL và LTrim ('') trả về null (6/6.5), vì vậy tôi tự hỏi liệu Coalesce trên một chuỗi rỗng cũng đã đánh giá nó là không, nếu nó đã làm biến các chuỗi ký tự chỉ thành các giá trị null? (Nếu tất cả các giá trị được đánh giá là null, Coalesce sẽ trả về Null.)

Đó là phỏng đoán và tôi không thể kiểm tra ngay lập tức, nhưng không khó để kiểm tra.

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