Remplacer les valeurs nulles par défaut renvoyées par la jointure externe gauche

97

J'ai une requête Microsoft SQL Server 2008 qui renvoie les données de trois tables en utilisant une jointure externe gauche. Plusieurs fois, il n'y a pas de données dans les deuxième et troisième tables et j'obtiens donc un null qui, je pense, est la valeur par défaut pour la jointure externe gauche. Existe-t-il un moyen de remplacer les valeurs par défaut dans l'instruction select? J'ai une solution de contournement en ce que je peux sélectionner dans une variable de table mais cela me semble un peu sale.

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'

Je voudrais que le Quantity et RegularPrice soient par défaut à zéro si possible.

Brett Bim
la source
Remarque: certaines des réponses de cet article concernent des bases de données autres que MSFT sql-server, ce qui fait que cette réponse apparaît également sur les pages de résultats de recherche pour ces autres contextes.
dreftymac

Réponses:

136

C'est aussi simple que

IsNull(FieldName, 0)

Ou plus complètement:

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'
Michael Haren
la source
4
Je savais que cela devait être facile, mais pour une raison quelconque, j'étais bloqué sur la façon de le faire. Merci.
Brett Bim
44
S'il s'agit de MySQL, IsNull doit être remplacé par 'IFNULL'. Merci.
Dhanushka le
17
Dans PostgreSQL, cela semble être "COALESCE" . Pour MySQL, la page de manuel est ici: "IFNULL" . Pas sûr de la norme.
David Tonhofer le
3
Dans DB2, la réponse semble être «changer de base de données».
rtf
1
Pour SQLite, ce sera le cas IFNULL.
Chintan Shah
11

En cas de MySQLou SQLitele mot-clé correct est IFNULL(non 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'
Zendem
la source
5

MySQL

COALESCE(field, 'default')

Par exemple:

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

En outre, vous pouvez utiliser plusieurs colonnes pour vérifier leur NULLpar COALESCE fonction. Par exemple:

mysql> SELECT COALESCE(NULL, 1, NULL);
        -> 1
mysql> SELECT COALESCE(0, 1, NULL);
        -> 0
mysql> SELECT COALESCE(NULL, NULL, NULL);
        -> NULL
Amir Fo
la source