แทนที่ค่า Null เริ่มต้นที่ส่งกลับจากการเข้าร่วมด้านนอกด้านซ้าย


99

ฉันมีแบบสอบถาม Microsoft SQL Server 2008 ที่ส่งคืนข้อมูลจากตารางสามตารางโดยใช้การรวมภายนอกด้านซ้าย หลายครั้งไม่มีข้อมูลในตารางที่สองและสามดังนั้นฉันจึงได้ค่าว่างซึ่งฉันคิดว่าเป็นค่าเริ่มต้นสำหรับการรวมภายนอกด้านซ้าย มีวิธีแทนที่ค่าเริ่มต้นในคำสั่ง select หรือไม่? ฉันมีวิธีแก้ปัญหาที่ฉันสามารถเลือกเป็นตัวแปรตารางได้ แต่รู้สึกสกปรกเล็กน้อย

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'

ฉันต้องการให้ปริมาณและราคาปกติเป็นค่าเริ่มต้นเป็นศูนย์ถ้าเป็นไปได้


หมายเหตุ:คำตอบบางส่วนในโพสต์นี้เกี่ยวข้องกับฐานข้อมูลอื่นที่ไม่ใช่ MSFT sql-server ทำให้คำตอบนี้ปรากฏในหน้าผลการค้นหาสำหรับบริบทอื่น ๆ ด้วย
dreftymac

ดูสิ่งนี้ด้วย: stackoverflow.com/questions/799375/…
dreftymac

คำตอบ:


140

ง่ายพอ ๆ กับ

IsNull(FieldName, 0)

หรือสมบูรณ์มากขึ้น:

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
ฉันรู้ว่ามันต้องง่าย แต่ด้วยเหตุผลบางอย่างฉันถูกบล็อกว่าจะทำอย่างไร ขอบคุณ.
Brett Bim

46
ถ้าเป็น MySQL ควรแทนที่ IsNull ด้วย 'IFNULL' ขอบคุณ.
Dhanushka

17
ใน PostgreSQL ก็น่าจะเป็น"เชื่อมต่อกัน" สำหรับ MySQL, หน้าคู่มืออยู่ที่นี่: "IFNULL" ไม่แน่ใจเกี่ยวกับมาตรฐาน
David Tonhofer

3
ใน DB2 คำตอบน่าจะเป็น 'สลับฐานข้อมูล'
rtf

2
สำหรับข้อมูล SQLite IFNULLก็จะเป็น
Chintan Shah

12

ในกรณีMySQLหรือSQLiteคีย์เวิร์ดที่ถูกต้องคือIFNULL(not 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')

ตัวอย่างเช่น:

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

นอกจากนี้คุณสามารถใช้หลายคอลัมน์เพื่อตรวจสอบNULLโดยฟังก์ชันCOALESCE ตัวอย่างเช่น:

mysql> SELECT COALESCE(NULL, 1, NULL);
        -> 1
mysql> SELECT COALESCE(0, 1, NULL);
        -> 0
mysql> SELECT COALESCE(NULL, NULL, NULL);
        -> NULL
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.