Sostituisci i valori nulli predefiniti restituiti dal join esterno sinistro


97

Ho una query di Microsoft SQL Server 2008 che restituisce i dati di tre tabelle utilizzando un join esterno sinistro. Molte volte, non ci sono dati nella seconda e terza tabella e quindi ottengo un valore nullo che penso sia l'impostazione predefinita per il join esterno sinistro. C'è un modo per sostituire i valori predefiniti nell'istruzione select? Ho una soluzione alternativa in quanto posso selezionare una variabile di tabella ma sembra un po 'sporca.

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'

Vorrei che la quantità e il prezzo normale fossero predefiniti a zero, se possibile.


Nota: alcune delle risposte in questo post riguardano database diversi da MSFT sql-server, facendo sì che questa risposta venga visualizzata anche nelle pagine dei risultati di ricerca per quegli altri contesti.
dreftymac

Risposte:


136

È facile quanto

IsNull(FieldName, 0)

O più completamente:

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
Sapevo che doveva essere facile ma per qualche motivo ero bloccato su come farlo. Grazie.
Brett Bim

44
Se è MySQL, IsNull dovrebbe essere sostituito con "IFNULL". Grazie.
Dhanushka

17
In PostgreSQL, sembra essere "COALESCE" . Per MySQL, la pagina di manuale è qui: "IFNULL" . Non sono sicuro dello standard.
David Tonhofer

3
In DB2 la risposta sembra essere "cambia database".
rtf

1
Per SQLite, lo sarà IFNULL.
Chintan Shah

11

In caso di MySQLo SQLitela parola chiave corretta è 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'

5

MySQL

COALESCE(field, 'default')

Per esempio:

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

Inoltre, è possibile utilizzare più colonne per verificare la loro NULLper COALESCE funzione. Per esempio:

mysql> SELECT COALESCE(NULL, 1, NULL);
        -> 1
mysql> SELECT COALESCE(0, 1, NULL);
        -> 0
mysql> SELECT COALESCE(NULL, NULL, NULL);
        -> NULL
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.