Zastąp domyślne wartości zerowe zwrócone z lewego zewnętrznego połączenia

98

Mam zapytanie Microsoft SQL Server 2008, które zwraca dane z trzech tabel przy użyciu lewego sprzężenia zewnętrznego. Wiele razy nie ma danych w drugiej i trzeciej tabeli, więc otrzymuję wartość null, która moim zdaniem jest domyślna dla lewego sprzężenia zewnętrznego. Czy istnieje sposób na zastąpienie wartości domyślnych w instrukcji select? Mam obejście polegające na tym, że mogę wybrać zmienną tabeli, ale wydaje się ona trochę brudna.

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'

Chciałbym, aby jeśli to możliwe, wartości Quantity i RegularPrice miały wartość domyślną zero.

Brett Bim
źródło
Uwaga: Niektóre odpowiedzi w tym poście dotyczą baz danych innych niż MSFT sql-server, co powoduje, że ta odpowiedź pojawia się na stronach wyników wyszukiwania również w innych kontekstach.
dreftymac

Odpowiedzi:

138

To tak proste, jak

IsNull(FieldName, 0)

Lub dokładniej:

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
źródło
4
Wiedziałem, że to musi być łatwe, ale z jakiegoś powodu zostałem zablokowany, jak to zrobić. Dzięki.
Brett Bim
44
Jeśli jest to MySQL, IsNull należy zastąpić wartością „IFNULL”. Dzięki.
Dhanushka
17
W PostgreSQL wygląda na to, że jest to „COALESCE” . Dla MySQL, strona podręcznika jest tutaj: "IFNULL" . Nie jestem pewien co do standardu.
David Tonhofer
3
W DB2 odpowiedzią wydaje się być „przełączanie baz danych”.
rtf
2
W przypadku SQLite będzie IFNULL.
Chintan Shah,
12

W przypadku MySQLlub SQLiteprawidłowe słowo kluczowe to IFNULL(nie 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
źródło
5

MySQL

COALESCE(field, 'default')

Na przykład:

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

Możesz również użyć wielu kolumn, aby sprawdzić ich za NULLpomocą funkcji COALESCE . Na przykład:

mysql> SELECT COALESCE(NULL, 1, NULL);
        -> 1
mysql> SELECT COALESCE(0, 1, NULL);
        -> 0
mysql> SELECT COALESCE(NULL, NULL, NULL);
        -> NULL
Amir Fo
źródło