替换从左外部联接返回的默认空值


97

我有一个Microsoft SQL Server 2008查询,该查询使用左外部联接从三个表返回数据。很多时候,第二个和第三个表中没有数据,因此我得到一个空值,我认为这是左外部联接的默认值。有没有办法替换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'

如果可能的话,我希望数量和常规价格默认为零。


注意:这篇文章中的某些答案涉及MSFT sql-server以外的数据库,导致该答案也显示在其他上下文的搜索结果页面上。
dreftymac

Answers:


136

那就像

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'

4
我知道这一定很容易,但是由于某种原因,我在如何做上受阻。谢谢。
Brett Bim

44
如果是MySQL,则将IsNull替换为'IFNULL'。谢谢。
Dhanushka 2014年

17
在PostgreSQL中,它似乎是“ COALESCE”。对于MySQL,手册页在这里:“ IFNULL”。不确定标准。
David Tonhofer 2014年

3
在DB2中,答案似乎是“切换数据库”。
rtf

1
对于SQLite,它将为IFNULL
Chintan Shah

11

如果是MySQLSQLite,正确的关键字是IFNULL(not ISNULL)。

 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'

5

的MySQL

COALESCE(field, 'default')

例如:

  SELECT
    t.id,
    COALESCE(d.field, 'default')
  FROM
     test t
  LEFT JOIN
     detail d ON t.id = d.item

另外,您可以使用多个列NULL通过COALESCE函数检查它们。例如:

mysql> SELECT COALESCE(NULL, 1, NULL);
        -> 1
mysql> SELECT COALESCE(0, 1, NULL);
        -> 0
mysql> SELECT COALESCE(NULL, NULL, NULL);
        -> NULL
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.