Replace Default Null Values ​​Returned From Left Outer Join

98

Saya memiliki kueri Microsoft SQL Server 2008 yang mengembalikan data dari tiga tabel menggunakan gabungan luar kiri. Seringkali, tidak ada data di tabel kedua dan ketiga dan jadi saya mendapatkan null yang menurut saya adalah default untuk left outer join. Apakah ada cara untuk mengganti nilai default dalam pernyataan pilih? Saya memiliki solusi yang dapat saya pilih ke dalam variabel tabel tetapi rasanya agak kotor.

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'

Saya ingin Kuantitas dan Harga Reguler menjadi nol jika memungkinkan.

Brett Bim
sumber
Catatan: Beberapa jawaban di posting ini berhubungan dengan database selain MSFT sql-server, menyebabkan jawaban ini muncul di halaman hasil pencarian untuk konteks lain itu juga.
dreftymac

Jawaban:

138

Semudah itu

IsNull(FieldName, 0)

Atau lebih lengkapnya:

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
sumber
4
Saya tahu itu harus mudah tetapi untuk beberapa alasan, saya diblokir tentang cara melakukannya. Terima kasih.
Brett Bim
44
Jika itu MySQL, IsNull harus diganti dengan 'IFNULL'. Terima kasih.
Dhanushka
17
Di PostgreSQL, tampaknya "COALESCE" . Untuk MySQL, halaman manualnya ada di sini: "IFNULL" . Tidak yakin dengan standarnya.
David Tonhofer
3
Dalam DB2 jawabannya tampaknya 'database switch'.
rtf
2
Untuk SQLite, itu akan menjadi IFNULL.
Chintan Shah
12

Dalam kasus MySQLatau SQLitekata kunci yang benar adalah IFNULL(tidak 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
sumber
5

MySQL

COALESCE(field, 'default')

Sebagai contoh:

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

Selain itu, Anda dapat menggunakan beberapa kolom untuk memeriksanya NULLdengan fungsi COALESCE . Sebagai contoh:

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