Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

แปลง NULL เป็น 0 ใน MySQL: COALESCE() vs IFNULL()

ใช้ IFNULL() หรือ COALESCE() แปลงค่า NULL เป็น 0 (หรือค่าเริ่มต้นอื่น)

ไวยากรณ์

SELECT IFNULL(yourColumnName, 0) AS anyAliasName FROM yourTableName;
SELECT COALESCE(yourColumnName, 0) AS anyAliasName FROM yourTableName;

สร้างตารางตัวอย่าง

mysql> CREATE TABLE convertNullToZeroDemo (
    -> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Name VARCHAR(20),
    -> Salary INT
    -> );

เพิ่มข้อมูลตัวอย่าง (มี NULL)

mysql> INSERT INTO convertNullToZeroDemo(Name, Salary) VALUES
('John', NULL), ('Carol', 5610), ('Bob', NULL), ('David', NULL);

แสดงข้อมูลก่อน

mysql> SELECT * FROM convertNullToZeroDemo;

ผลลัพธ์:

+----+-------+--------+
| Id | Name  | Salary |
+----+-------+--------+
| 1  | John  | NULL   |
| 2  | Carol | 5610   |
| 3  | Bob   | NULL   |
| 4  | David | NULL   |
+----+-------+--------+

วิธีที่ 1: IFNULL() (MySQL เฉพาะ)

mysql> SELECT IFNULL(Salary, 0) AS CONVERT_NULL_TO_0 FROM convertNullToZeroDemo;

ผลลัพธ์:

+--------------------+
| CONVERT_NULL_TO_0  |
+--------------------+
| 0                  |
| 5610               |
| 0                  |
| 0                  |
+--------------------+

วิธีที่ 2: COALESCE() (มาตรฐาน ANSI SQL)

mysql> SELECT COALESCE(Salary, 0) AS CONVERT_NULL_TO_0 FROM convertNullToZeroDemo;

ผลลัพธ์:

+--------------------+
| CONVERT_NULL_TO_0  |
+--------------------+
| 0                  |
| 5610               |
| 0                  |
| 0                  |
+--------------------+

เปรียบเทียบ IFNULL vs COALESCE

คุณสมบัติIFNULL(expr1, expr2)COALESCE(expr1, expr2, ...)
พารามิเตอร์2 ตัวเท่านั้น2 ตัวขึ้นไป
มาตรฐานMySQL proprietaryANSI SQL Standard
พกพา (Portable)ไม่ได้ (MySQL only)ได้ (PostgreSQL, SQL Server, Oracle, SQLite)
ประสิทธิภาพเร็วกว่าเล็กน้อยช้ากว่าเล็กน้อย (น้อยมาก)
การประเมินค่าประเมิน expr1 1 ครั้งประเมินตามลำดับจนกว่าจะเจอ non-NULL

ตัวอย่าง COALESCE หลายพารามิเตอร์

-- เลือกค่าแรกที่ไม่ใช่ NULL จาก phone, mobile, email, แล้วค่อย 'N/A'
SELECT COALESCE(phone, mobile, email, 'N/A') AS contact FROM users;

แนวทางเลือกใช้

  • โปรเจกต์ MySQL เท่านั้น ต้องการความเร็วสูงสุด: IFNULL()
  • โปรเจกต์อาจย้าย DB หรือต้องการมาตรฐาน: COALESCE()
  • ต้องตรวจสอบหลายคอลัมน์/ค่า: COALESCE() เท่านั้น