Thay thế các giá trị rỗng mặc định được trả về từ kết nối bên ngoài bên trái


97

Tôi có một truy vấn Microsoft SQL Server 2008 trả về dữ liệu từ ba bảng bằng cách sử dụng kết nối bên ngoài bên trái. Nhiều lần, không có dữ liệu trong bảng thứ hai và thứ ba và vì vậy tôi nhận được giá trị null mà tôi nghĩ là mặc định cho phép nối bên ngoài bên trái. Có cách nào để thay thế các giá trị mặc định trong câu lệnh select không? Tôi có một cách giải quyết trong đó tôi có thể chọn vào một biến bảng nhưng cảm thấy hơi bẩn.

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'

Tôi muốn Số lượng và Giá thông thường để mặc định bằng 0 nếu có thể.


Lưu ý: Một số câu trả lời trên bài đăng này liên quan đến cơ sở dữ liệu khác ngoài MSFT sql-server, khiến câu trả lời này cũng hiển thị trên các trang kết quả tìm kiếm cho các ngữ cảnh khác đó.
dreftymac

Câu trả lời:


136

Điều đó dễ dàng như

IsNull(FieldName, 0)

Hoặc hoàn toàn hơn:

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
Tôi biết nó phải dễ dàng nhưng vì một số lý do, tôi đã bị chặn về cách thực hiện. Cảm ơn.
Brett Bim

44
Nếu là MySQL, IsNull nên được thay thế bằng 'IFNULL'. Cảm ơn.
Dhanushka,

17
Trong PostgreSQL, nó có vẻ là "COALESCE" . Đối với MySQL, trang hướng dẫn ở đây: "IFNULL" . Không chắc chắn về tiêu chuẩn.
David Tonhofer

3
Trong DB2, câu trả lời dường như là 'chuyển đổi cơ sở dữ liệu'.
rtf

1
Đối với SQLite, nó sẽ là IFNULL.
Chintan Shah

11

Trong trường hợp của MySQLhoặc SQLitetừ khóa chính xác là IFNULL(không 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')

Ví dụ:

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

Ngoài ra, bạn có thể sử dụng nhiều cột để kiểm tra chúng NULLbằng hàm COALESCE . Ví dụ:

mysql> SELECT COALESCE(NULL, 1, NULL);
        -> 1
mysql> SELECT COALESCE(0, 1, NULL);
        -> 0
mysql> SELECT COALESCE(NULL, NULL, NULL);
        -> NULL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.