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.


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'

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'

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.