Ersetzen Sie die Standard-Nullwerte, die vom linken äußeren Join zurückgegeben wurden

97

Ich habe eine Microsoft SQL Server 2008-Abfrage, die Daten aus drei Tabellen mithilfe eines linken äußeren Joins zurückgibt. Oft sind in der zweiten und dritten Tabelle keine Daten enthalten, und daher erhalte ich eine Null, die meiner Meinung nach die Standardeinstellung für den linken äußeren Join ist. Gibt es eine Möglichkeit, die Standardwerte in der select-Anweisung zu ersetzen? Ich habe eine Problemumgehung, bei der ich eine Tabellenvariable auswählen kann, die sich jedoch etwas schmutzig anfühlt.

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'

Ich möchte, dass Quantity und RegularPrice nach Möglichkeit standardmäßig auf Null gesetzt werden.

Brett Bim
quelle
Hinweis: Einige der Antworten in diesem Beitrag beziehen sich auf andere Datenbanken als MSFT SQL Server, sodass diese Antwort auch auf den Suchergebnisseiten für diese anderen Kontexte angezeigt wird.
Dreftymac

Antworten:

136

Das ist so einfach wie

IsNull(FieldName, 0)

Oder vollständiger:

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
quelle
4
Ich wusste, dass es einfach sein musste, aber aus irgendeinem Grund war ich blockiert, wie es geht. Vielen Dank.
Brett Bim
44
Wenn es sich um MySQL handelt, sollte IsNull durch 'IFNULL' ersetzt werden. Vielen Dank.
Dhanushka
17
In PostgreSQL scheint es "COALESCE" zu sein . Für MySQL ist die Handbuchseite hier: "IFNULL" . Ich bin mir nicht sicher über den Standard.
David Tonhofer
3
In DB2 scheint die Antwort "Datenbanken wechseln" zu sein.
RTF
1
Für SQLite wird es sein IFNULL.
Chintan Shah
11

Im Falle von MySQLoder ist SQLitedas richtige Schlüsselwort IFNULL(nicht 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
quelle
5

MySQL

COALESCE(field, 'default')

Beispielsweise:

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

Sie können auch mehrere Spalten verwenden, um deren Funktion NULLnach COALESCE zu überprüfen . Beispielsweise:

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