ส่งคืน 0 ถ้าฟิลด์เป็นโมฆะใน MySQL


160

ใน MySQL มีวิธีตั้งค่าเขตข้อมูล "รวม" เป็นศูนย์หรือไม่ถ้าเป็น NULL

นี่คือสิ่งที่ฉันมี:

SELECT uo.order_id, uo.order_total, uo.order_status,
            (SELECT SUM(uop.price * uop.qty) 
             FROM uc_order_products uop 
             WHERE uo.order_id = uop.order_id
            ) AS products_subtotal,
            (SELECT SUM(upr.amount) 
             FROM uc_payment_receipts upr 
             WHERE uo.order_id = upr.order_id
            ) AS payment_received,
            (SELECT SUM(uoli.amount) 
             FROM uc_order_line_items uoli 
             WHERE uo.order_id = uoli.order_id
            ) AS line_item_subtotal
            FROM uc_orders uo
            WHERE uo.order_status NOT IN ("future", "canceled")
            AND uo.uid = 4172;

0ข้อมูลที่ออกมาดีมายกเว้นสาขาโมฆะที่ควรจะเป็น

ฉันจะคืนค่า 0 สำหรับ NULL ใน MySQL ได้อย่างไร

คำตอบ:


327

ใช้IFNULL :

IFNULL(expr1, 0)

จากเอกสาร:

ถ้า expr1 ไม่ใช่ NULL, IFNULL () จะส่งคืน expr1; มิฉะนั้นจะส่งคืน expr2 IFNULL () ส่งคืนค่าตัวเลขหรือสตริงขึ้นอยู่กับบริบทที่ใช้


นั่นจะเป็น IFNULL ((เลือก SUM (uop.price * uop.qty)) จาก uc_order_products uop WHERE uo.order_id = uop.order_id) AS products_subtotal, 0)?
เควิน

2
@ เควิน: ไม่ - นามแฝงจบแล้ว
Mark Byers

2
@ MarkByers คุณสามารถแสดงให้เห็นว่าทำไมตัวอย่างของ Kevin ในความคิดเห็นที่ไม่ถูกต้องและสิ่งที่ควรเป็นจริงหรือไม่
ไมเคิล

ขอบคุณมาก !! นี่คือสิ่งที่ฉันกำลังมองหา
brunobliss

@ MarkByers IFNOtNULL (expr1, 1) มีอะไรแบบนั้นบ้าง
Noni

25

คุณสามารถใช้แทนเพียงcoalesce(column_name,0) ฟังก์ชันส่งกลับค่าที่ไม่ใช่โมฆะแรกในรายการcolumn_namecoalesce

ฉันควรพูดถึงว่าฟังก์ชั่นแบบแถวต่อแถวนี้มักเป็นปัญหาสำหรับการขยายขีดความสามารถ หากคุณคิดว่าฐานข้อมูลของคุณอาจได้รับจะเป็นขนาดที่เหมาะสมก็มักจะดีกว่าที่จะใช้คอลัมน์พิเศษและทริกเกอร์ที่จะย้ายค่าใช้จ่ายจากselectไปinsert/updateไป

สิ่งนี้ตัดค่าใช้จ่ายโดยสมมติว่าฐานข้อมูลของคุณอ่านบ่อยกว่าที่เขียน (และส่วนใหญ่จะเป็น)


สิ่งนี้เกิดขึ้นสัปดาห์ละครั้งเพื่อเรียกเก็บเงินลูกค้าทั้งหมด ข้อมูลถูกเขียนตลอดทั้งสัปดาห์จากนั้นในช่วงเวลาหนึ่งข้อมูลจะถูกคำนวณและถูกเรียกเก็บเงิน คิดว่ามันเหมือนบริการสมัครสมาชิก คุณสามารถเปลี่ยนแปลงได้ในช่วงระยะเวลาการเรียกเก็บเงินและกิจกรรมของคุณจะถูกเรียกเก็บเงินตามช่วงเวลาที่เหมาะสม
เควิน

ฉันจะเพิ่มว่าในสถานการณ์นี้ที่ฉันต้องการรวมกันเพราะมันเป็นไวยากรณ์เดียวกันสำหรับ MS และ My SQLs ในขณะที่ MS SQL เป็น iSnull และ MySQL เป็น iFnull ถ้าเรื่องนั้นกับทุกคน (MySQLs ISNULL เป็นฟังก์ชั่นที่แตกต่างจาก ISNULL ของ MS SQL)
Craig Jacobs

11

คำตอบข้างต้นไม่สมบูรณ์สำหรับฉัน หากฟิลด์ของคุณมีชื่อfieldดังนั้นตัวเลือกควรเป็นฟิลด์ต่อไปนี้:

IFNULL(`field`,0) AS field

ตัวอย่างเช่นในการสืบค้น SELECT:

SELECT IFNULL(`field`,0) AS field, `otherfield` FROM `mytable`

หวังว่านี่จะช่วยให้ใครบางคนไม่ต้องเสียเวลา


5

คุณสามารถลองสิ่งนี้

IFNULL(NULLIF(X, '' ), 0)

แอตทริบิวต์ X จะถือว่าว่างถ้าเป็นสตริงว่างดังนั้นหลังจากนั้นคุณสามารถประกาศเป็นศูนย์แทนค่าสุดท้าย ในอีกกรณีหนึ่งมันจะยังคงเป็นค่าดั้งเดิม

อย่างไรก็ตามเพียงเพื่อให้วิธีอื่นในการทำเช่นนั้น


สิ่งนี้ทำงานได้ดีสำหรับฉันในระหว่าง SELECT กับปกติ IFNULL (var, 0)
ajankuv

5

ใช่ฟังก์ชั่น IFNULL จะทำงานเพื่อให้ได้ผลลัพธ์ที่คุณต้องการ

SELECT uo.order_id, uo.order_total, uo.order_status,
        (SELECT IFNULL(SUM(uop.price * uop.qty),0) 
         FROM uc_order_products uop 
         WHERE uo.order_id = uop.order_id
        ) AS products_subtotal,
        (SELECT IFNULL(SUM(upr.amount),0) 
         FROM uc_payment_receipts upr 
         WHERE uo.order_id = upr.order_id
        ) AS payment_received,
        (SELECT IFNULL(SUM(uoli.amount),0) 
         FROM uc_order_line_items uoli 
         WHERE uo.order_id = uoli.order_id
        ) AS line_item_subtotal
        FROM uc_orders uo
        WHERE uo.order_status NOT IN ("future", "canceled")
        AND uo.uid = 4172;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.