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

Mysql 替换从左外部联接返回的默认空值,mysql,sql,sql-server,tsql,sql-server-2008,Mysql,Sql,Sql Server,Tsql,Sql Server 2008,我有一个MicrosoftSQLServer2008查询,它使用左外部联接从三个表返回数据。很多时候,第二个和第三个表中没有数据,所以我得到一个空值,我认为这是左外连接的默认值。是否有方法替换select语句中的默认值?我有一个变通方法,可以选择一个表变量,但感觉有点脏 SELECT iar.Description, iai.Quantity, iai.Quantity * rpl.RegularPrice as 'Retail', iar.Compliance FROM InventoryA

我有一个MicrosoftSQLServer2008查询,它使用左外部联接从三个表返回数据。很多时候,第二个和第三个表中没有数据,所以我得到一个空值,我认为这是左外连接的默认值。是否有方法替换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'
如果可能的话,我希望数量和正常价格默认为零。

这很容易

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'

如果是
MySQL
SQLite
,正确的关键字是
IFNULL
(而不是
ISNULL

MySQL 例如:

  SELECT
    t.id,
    COALESCE(d.field, 'default')
  FROM
     test t
  LEFT JOIN
     detail d ON t.id = d.item
mysql> SELECT COALESCE(NULL, 1, NULL);
        -> 1
mysql> SELECT COALESCE(0, 1, NULL);
        -> 0
mysql> SELECT COALESCE(NULL, NULL, NULL);
        -> NULL
此外,您还可以使用多个列按函数检查它们的
NULL
。 例如:

  SELECT
    t.id,
    COALESCE(d.field, 'default')
  FROM
     test t
  LEFT JOIN
     detail d ON t.id = d.item
mysql> SELECT COALESCE(NULL, 1, NULL);
        -> 1
mysql> SELECT COALESCE(0, 1, NULL);
        -> 0
mysql> SELECT COALESCE(NULL, NULL, NULL);
        -> NULL

对于Oracle,您可以使用:

NVL(columnName,deafultValue)
:-NVL用于在查询输出中将空值转换为默认值。如果你想用“NA”来替换空值,那么使用类似这样的东西


从tableName中选择NVL(columnName,'NA')

我知道这必须很简单,但由于某种原因,我被阻止了怎么做。谢谢。如果是MySQL,IsNull应该替换为“IFNULL”。谢谢。在PostgreSQL中,似乎是这样。对于MySQL,手册页面如下:。不确定标准。在DB2中,答案似乎是“切换数据库”。对于SQLite,答案将是
IFNULL
。注意:本文中的一些答案涉及MSFT sql server以外的数据库,导致该答案也显示在其他上下文的搜索结果页面上。另请参阅: