2009-11-02 28 views
64

Tôi có truy vấn Microsoft SQL Server 2008 trả về dữ liệu từ ba bảng bằng cách sử dụng phép nối ngoài bên trái. Nhiều lần, không có dữ liệu trong bảng thứ hai và thứ ba và vì vậy tôi nhận được một null mà tôi nghĩ là mặc định cho bên ngoài tham gia bên ngoài. Có cách nào để thay thế các giá trị mặc định trong câu lệnh chọn không? Tôi có một workaround ở chỗ tôi có thể chọn vào một biến bảng nhưng nó cảm thấy một chút bẩn.Thay thế giá trị rỗng mặc định được trả về từ bên trái bên trái Tham gia

SELECT iar.Description, iai.Quantity, iai.Quantity * rpl.RegularPrice as 'Retail', 
iar.Compliance FROM InventoryAdjustmentReason iar 
LEFT OUTER JOIN InventoryAdjustmentItem iai on (iar.Id = iai.InventoryAdjustmentReasonId) 
LEFT OUTER JOIN Item i on (i.Id = iai.ItemId) 
LEFT OUTER JOIN ReportPriceLookup rpl on (rpl.SkuNumber = i.SkuNo) 
WHERE iar.StoreUse = 'yes' 

Tôi muốn Số lượng và Giá thông thường mặc định bằng không nếu có thể.

Trả lời

102

Đó là dễ dàng như

IsNull(FieldName, 0) 

Hoặc hoàn toàn hơn:

SELECT iar.Description, 
    ISNULL(iai.Quantity,0) as Quantity, 
    ISNULL(iai.Quantity * rpl.RegularPrice,0) as 'Retail', 
    iar.Compliance 
FROM InventoryAdjustmentReason iar 
LEFT OUTER JOIN InventoryAdjustmentItem iai on (iar.Id = iai.InventoryAdjustmentReasonId) 
LEFT OUTER JOIN Item i on (i.Id = iai.ItemId) 
LEFT OUTER JOIN ReportPriceLookup rpl on (rpl.SkuNumber = i.SkuNo) 
WHERE iar.StoreUse = 'yes' 
+3

Tôi biết điều đó phải dễ dàng nhưng vì một lý do nào đó, tôi đã bị chặn cách thực hiện. Cảm ơn. –

+29

Nếu đó là MySQL, IsNull nên được thay thế bằng 'IFNULL'. Cảm ơn. – Dhanushka

+10

Trong PostgreSQL, nó có vẻ là ["COALESCE"] (http://www.postgresql.org/docs/9.3/static/functions-conditional.html). Đối với MySQL, trang hướng dẫn là ở đây: ["IFNULL"] (http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html). Không chắc chắn về tiêu chuẩn. –

0

Không ISNULL của mình, trong IFNULL này.

SELECT iar.Description, 
     IFNULL(iai.Quantity,0) as Quantity, 
     IFNULL(iai.Quantity * rpl.RegularPrice,0) as 'Retail', 
     iar.Compliance 
    FROM InventoryAdjustmentReason iar 
    LEFT OUTER JOIN InventoryAdjustmentItem iai on (iar.Id = iai.InventoryAdjustmentReasonId) 
    LEFT OUTER JOIN Item i on (i.Id = iai.ItemId) 
    LEFT OUTER JOIN ReportPriceLookup rpl on (rpl.SkuNumber = i.SkuNo) 
WHERE iar.StoreUse = 'yes' 
Các vấn đề liên quan