2009-11-02 73 views
64

我有一个Microsoft SQL Server 2008查询使用左外连接从三个表中返回数据。很多时候,第二个和第三个表中都没有数据,所以我得到一个null,我认为它是左外连接的默认值。有没有办法在select语句中替换默认值?我有一个解决方法,我可以选择一个表变量,但感觉有点肮脏。替换从左外连接返回的默认空值

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' 

我希望数量和RegularPrice默认为零,如果可能的话。

回答

102

这是那么容易,因为

IsNull(FieldName, 0) 

或者更彻底:

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

我知道这一定很容易,但由于某种原因,我被阻止如何做到这一点。谢谢。 –

+29

如果是MySQL,则应将IsNull替换为'IFNULL'。谢谢。 – Dhanushka

+10

在PostgreSQL中,它似乎是[“COALESCE”](http://www.postgresql.org/docs/9.3/static/functions-conditional.html)。对于MySQL,手册页在这里:[“IFNULL”](http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html)。不知道标准。 –

0

不是他ISNULL,在此IFNULL。

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'