web-dev-qa-db-ja.com

左外部結合から返されたデフォルトのヌル値を置き換える

左外部結合を使用して3つのテーブルからデータを返すMicrosoft SQL Server 2008クエリがあります。多くの場合、2番目と3番目のテーブルにはデータがないため、左外部結合のデフォルトだと思う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'

可能であれば、QuantityとRegularPriceのデフォルトをゼロにしたいと思います。

84
Brett Bim

それは簡単です

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'
126
Michael Haren

MySQLまたはSQLiteの場合、正しいキーワードはIFNULLISNULLではなく)です。

 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'
6
Zendem

MySQL

COALESCE(field, 'default')

例えば:

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

また、 [〜#〜] coalesce [〜#〜] 関数により、複数の列を使用してNULLを確認できます。例えば:

mysql> SELECT COALESCE(NULL, 1, NULL);
        -> 1
mysql> SELECT COALESCE(7, 1, NULL);
        -> 7
mysql> SELECT COALESCE(NULL,NULL,NULL);
        -> NULL
3
Amir Forsati