【问题标题】:Replace Default Null Values Returned From Left Outer Join替换从左外连接返回的默认空值
【发布时间】:2010-12-12 11:09:24
【问题描述】:

我有一个 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'

如果可能,我希望 Quantity 和 RegularPrice 默认为零。

【问题讨论】:

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

标签: mysql sql sql-server tsql sql-server-2008


【解决方案1】:

就这么简单

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,IsNull 应该替换为 'IFNULL'。谢谢。
  • 在 PostgreSQL 中,好像是"COALESCE"。对于 MySQL,手册页在这里:"IFNULL"。不确定标准。
  • 在 DB2 中,答案似乎是“切换数据库”。
  • 对于 SQLite,它将是 IFNULL
【解决方案2】:

如果是MySQLSQLite,正确的关键字是IFNULL(不是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'

【讨论】:

    【解决方案3】:

    MySQL

    COALESCE(field, 'default')
    

    例如:

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

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

    mysql> SELECT COALESCE(NULL, 1, NULL);
            -> 1
    mysql> SELECT COALESCE(0, 1, NULL);
            -> 0
    mysql> SELECT COALESCE(NULL, NULL, NULL);
            -> NULL
    

    【讨论】:

      【解决方案4】:

      对于 Oracle,您可以使用:

      NVL(columnName,deafultValue) :- NVL 用于将空值转换为查询输出中的默认值。例如。如果您想用 'NA' 替换空值,请使用类似的内容。

      SELECT NVL(columnName,'NA') FROM tableName

      【讨论】:

        猜你喜欢
        • 2012-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-26
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多