คู่มือฟังก์ชัน IFNULL ของ MySQL: แทนที่ค่า NULL (ทางเลือกของ Oracle NVL)

目次

1. บทนำ

เมื่อทำงานกับฐานข้อมูล การจัดการค่าค่า NULL เป็นจุดสำคัญ
โดยเฉพาะอย่างยิ่ง ไม่ใช่เรื่องแปลกที่ ผู้ที่เคยชินกับฟังก์ชัน NVL ของ Oracle จะพบว่า NVL ไม่มีให้ใช้เมื่อย้ายไปยัง MySQL

ใน MySQL คุณสามารถจัดการค่าค่า NULL ได้อย่างเหมาะสมโดยใช้ฟังก์ชัน IFNULL แทน NVL
บทความนี้จะอธิบาย วิธีการทำงานกับค่าค่า NULL ใน MySQL อย่างละเอียด โดยครอบคลุมวิธีใช้ IFNULL และความแตกต่างจากฟังก์ชันจัดการ NULL อื่นๆ

1.1 ค่าค่า NULL คืออะไร?

ในฐานข้อมูล NULL หมายถึง “ยังไม่ได้กำหนดค่า”
เนื่องจากสิ่งนี้ แตกต่างจาก “0” หรือ “สตริงว่าง” การไม่จัดการอย่างเหมาะสมอาจนำไปสู่ข้อผิดพลาดที่ไม่คาดคิดหรือผลลัพธ์การค้นหาที่ไม่ถูกต้อง

ตัวอย่างเช่น สมมติว่าคุณมีข้อมูลดังนี้

IDNameAge
1Yamada25
2SatoNULL
3Suzuki30

ในข้อมูลข้างต้น อายุของ ID “2” (Sato) คือ NULL
หากคุณรันการคำนวณตามนั้น คุณอาจได้รับข้อผิดพลาดหรือผลลัพธ์ที่ไม่ตั้งใจ

1.2 MySQL จัดการค่าค่า NULL อย่างไร

2. ฟังก์ชัน IFNULL คืออะไร?

MySQL มีฟังก์ชัน IFNULL เป็น ฟังก์ชันสำหรับแทนที่ค่าค่า NULL ด้วยค่าอื่น
มันมีบทบาทคล้ายกับฟังก์ชัน NVL ของ Oracle

โดยการจัดการค่าค่า NULL อย่างเหมาะสม คุณสามารถป้องกันปัญหาการคำนวณที่เกิดจากข้อมูลที่ขาดหายไปและสร้างคำสั่ง SQL ที่เสถียรกว่า
มาดูการใช้งานพื้นฐานของ IFNULL กันอย่างละเอียด

2.1 โครงสร้างพื้นฐานของ IFNULL

โครงสร้างพื้นฐานของฟังก์ชัน IFNULL คือดังนี้

IFNULL(expression, fallback_value)
  • expression : คอลัมน์หรือค่าที่จะตรวจสอบสำหรับ NULL
  • fallback_value : ค่าที่จะส่งคืนเมื่อ expression เป็น NULL (หากไม่ใช่ NULL จะส่งคืน expression ตามเดิม)

ตัวอย่างเช่น พิจารณาคำสั่ง SQL ต่อไปนี้

SELECT IFNULL(NULL, 'Fallback value');

ในกรณีนี้ เนื่องจากระบุ NULL ผลลัพธ์จึงกลายเป็น 'Fallback value'

Result
Fallback value

ในทางตรงกันข้าม หากคุณระบุค่าที่ไม่ใช่ NULL ค่านั้นจะถูกส่งคืนตามเดิม

SELECT IFNULL('Hello', 'Fallback value');
Result
Hello

2.2 ลักษณะสำคัญของ IFNULL

ฟังก์ชัน IFNULL มีลักษณะดังต่อไปนี้

  1. สามารถแปลงค่าค่า NULL เป็นค่าที่เฉพาะเจาะจง
  • คุณสามารถตั้งค่าพื้นฐานทางเลือกสำหรับคอลัมน์ที่อาจมี NULL
  1. ใช้โครงสร้างที่เรียบง่าย
  • เรียบง่ายกว่าการใช้ expression CASE
  1. ควรพิจารณาประเภทข้อมูล
  • แนะนำให้อาร์กิวเมนต์ของ IFNULL เป็นประเภทข้อมูลเดียวกัน

ตัวอย่างเช่น คำสั่ง SQL ต่อไปนี้อาจทำให้เกิดข้อผิดพลาด

SELECT IFNULL(100, 'Error');

เหตุผล: ประเภทตัวเลข (100) และประเภทสตริง (‘Error’) ผสมกัน
ในกรณีนี้ ค่าทางเลือกควรเป็นตัวเลขด้วย

SELECT IFNULL(100, 0);

2.3 เมื่อใดควรใช้ IFNULL

นี่คือสถานการณ์ปฏิบัติที่ IFNULL มีประโยชน์

  1. ตั้งค่าพื้นฐานสำหรับ NULL
  • ตัวอย่างเช่น หากโบนัสของพนักงานเป็น NULL ให้ตั้งเป็น 0
    SELECT name, IFNULL(bonus, 0) AS bonus
    FROM employees;
    
  1. หลีกเลี่ยงการคำนวณที่เกี่ยวข้องกับ NULL
  • หากคุณคำนวณด้วย NULL ตามนั้น ผลลัพธ์ก็จะกลายเป็น NULL
  • การใช้ IFNULL เพื่อหลีกเลี่ยง NULL จะช่วยให้การคำนวณตามที่ตั้งใจเกิดขึ้น
    SELECT name, salary, IFNULL(bonus, 0) AS bonus, salary + IFNULL(bonus, 0) AS total_income
    FROM employees;
    
  1. จัดการ NULL อย่างเหมาะสมในรายงานและการรวมข้อมูล
  • หากมี NULL ระหว่างการวิเคราะห์ อาจทำให้เกิดรายงานที่ไม่ถูกต้อง
  • โดยการแทนที่ NULL ด้วยค่าที่เฉพาะเจาะจงโดยใช้ IFNULL คุณสามารถประมวลผลข้อมูลได้อย่างสม่ำเสมอ

3. ตัวอย่างปฏิบัติของฟังก์ชัน IFNULL

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

3.1 แทนที่ค่าค่า NULL ด้วยค่าพื้นฐาน

หากตารางมีค่าค่า NULL อาจทำให้เกิดพฤติกรรมที่ไม่ตั้งใจ
เพื่อแก้ไขปัญหานี้ คุณสามารถใช้ IFNULL เพื่อแทนที่ NULL ด้วยค่าพื้นฐาน

ตัวอย่าง: หากโบนัสของพนักงานเป็น NULL, ตั้งค่าดีฟอลต์เป็น 0

SELECT name, IFNULL(bonus, 0) AS bonus
FROM employees;

ข้อมูลก่อนดำเนินการ

namebonus
Sato5000
SuzukiNULL
Takahashi8000

หลังจากใช้ IFNULL

namebonus
Sato5000
Suzuki0
Takahashi8000

การแทนที่ NULL ด้วย 0 ทำให้การรวมข้อมูลและการประมวลผลที่เกี่ยวข้องเป็นไปอย่างราบรื่น.

3.2 หลีกเลี่ยงการคำนวณที่รวม NULL

ใน MySQL, ผลลัพธ์ของการคำนวณที่รวม NULL จะเป็น NULL.
ดังนั้นคุณต้องใช้ IFNULL เพื่อหลีกเลี่ยง NULL.

ตัวอย่าง: คำนวณผลรวมของเงินเดือนและโบนัส

SELECT name, salary, IFNULL(bonus, 0) AS bonus, salary + IFNULL(bonus, 0) AS total_income
FROM employees;

ข้อมูลก่อนดำเนินการ

namesalarybonus
Sato3000005000
Suzuki280000NULL
Takahashi3200008000

หลังจากใช้ IFNULL

namesalarybonustotal_income
Sato3000005000305000
Suzuki2800000280000
Takahashi3200008000328000

หากโบนัสเป็น NULL, ผลรวม (salary + bonus) จะเป็น NULL ด้วย,
แต่โดยการใช้ IFNULL, MySQL จะถือว่า NULL เป็น 0 และคำนวณได้อย่างถูกต้อง.

3.3 แทนที่ NULL ด้วยสตริงอื่น

คุณสามารถตั้งค่าสตริงค่าเริ่มต้นได้ไม่เฉพาะตัวเลขเท่านั้น แต่ยังเมื่อค่าคือ NULL.

ตัวอย่าง: แสดง “ยังไม่ได้ลงทะเบียน” สำหรับผู้ใช้ที่ไม่มีที่อยู่อีเมล

SELECT id, name, IFNULL(email, 'Not registered') AS email
FROM users;

ข้อมูลก่อนดำเนินการ

idnameemail
1Satosatou@example.com
2SuzukiNULL
3Takahashitakahashi@example.com

หลังจากใช้ IFNULL

idnameemail
1Satosatou@example.com
2SuzukiNot registered
3Takahashitakahashi@example.com

หากปล่อยเป็น NULL, ฟิลด์จะแสดงเป็นช่องว่าง, แต่ IFNULL ทำให้แสดงอย่างชัดเจนด้วย “ยังไม่ได้ลงทะเบียน”.

3.4 ใช้ IFNULL ในเงื่อนไข WHERE

คุณสามารถใช้ IFNULL ในเงื่อนไข WHERE เพื่อกรองตามเงื่อนไขที่รวมค่าที่เป็น NULL.

ตัวอย่าง: ดึงข้อมูลผู้ใช้ที่มีค่า NULL เท่านั้น

SELECT *
FROM users
WHERE IFNULL(email, '') = '';

SQL นี้จะถือว่า email เป็น '' (สตริงว่าง) เมื่อมันเป็น NULL, และดึงข้อมูลผู้ใช้ที่อีเมลเป็น NULL เท่านั้น.

3.5 วางค่า NULL ไว้ท้ายใน ORDER BY

โดยปกติเมื่อใช้ ORDER BY, ค่าที่เป็น NULL อาจปรากฏเป็นอันดับแรก, แต่คุณสามารถใช้ IFNULL เพื่อย้ายไปไว้ท้ายได้.

ตัวอย่าง: วางแถวที่มีค่า NULL ไว้ท้าย

SELECT name, salary
FROM employees
ORDER BY IFNULL(salary, 0) ASC;

4. ความแตกต่างระหว่าง IFNULL กับ COALESCE

MySQL มีฟังก์ชันหลายตัวสำหรับจัดการค่าที่เป็น NULL, และ IFNULL กับ COALESCE มักถูกเปรียบเทียบกัน.
ทั้งสองทำการแทนที่ค่า NULL ด้วยค่าอื่น, แต่การใช้งานและพฤติกรรมจะแตกต่างกัน.

ในส่วนนี้ เราจะอธิบาย ความแตกต่างระหว่าง IFNULL กับ COALESCE และวิธีเลือกใช้ให้เหมาะสม.

4.1 ฟังก์ชัน COALESCE คืออะไร?

ฟังก์ชัน COALESCE จะคืนค่า ค่าที่ไม่เป็น NULL ตัวแรกจากหลายอาร์กิวเมนต์.
กล่าวคือ ในขณะที่ IFNULL เลือกค่าที่ไม่เป็น NULL ระหว่างสองค่า,
COALESCE แตกต่างโดยเลือก ค่าที่ไม่เป็น NULL ตัวแรกจากหลายตัวเลือก.

ไวยากรณ์

COALESCE(expr1, expr2, ... , exprN)
  • ประเมินจากซ้ายไปขวา และ คืนค่าที่ไม่เป็น NULL ตัวแรก
  • คืนค่า NULL หากอาร์กิวเมนต์ทั้งหมดเป็น NULL

ตัวอย่าง: แทนที่ NULL ด้วย COALESCE

SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;

ในกรณีนี้ ค่าจะถูกกำหนดดังต่อไปนี้.

  1. หาก phone ไม่เป็น NULL, คืนค่า phone.
  2. หาก phone เป็น NULL และ email ไม่เป็น NULL, คืนค่า email.
  3. หากทั้ง phone และ email เป็น NULL, คืนค่า 'Not registered'.

4.2 ความแตกต่างระหว่าง IFNULL กับ COALESCE

Comparison itemIFNULLCOALESCE
NULL handlingReturns the fallback value if one expression is NULLEvaluates multiple expressions and returns the first non-NULL value
Number of argumentsOnly 22 or more (multiple allowed)
Use caseSimple NULL replacementNULL handling with priority order
Execution speedFast (compares only 2 values)Slightly slower (evaluates multiple values in order)

4.3 ตัวอย่างการใช้งานจริงของ IFNULL และ COALESCE

ตัวอย่าง 1: การแทนที่ NULL อย่างง่าย

ด้วย IFNULL, คุณสามารถเลือกค่าที่ไม่เป็น NULL ระหว่างสองค่าได้.

SELECT name, IFNULL(phone, 'Not registered') AS contact_info
FROM customers;

ผลลัพธ์

namephonecontact_info
Sato080-1234-5678080-1234-5678
SuzukiNULLNot registered

ตัวอย่าง 2: เลือกค่าที่ไม่เป็น NULL ตัวแรกที่มีอยู่

ด้วย COALESCE, คุณสามารถดึงค่าที่ไม่เป็น NULL ตัวแรกได้.

SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;

ผลลัพธ์

namephoneemailcontact_info
Sato080-1234-5678satou@example.com080-1234-5678
SuzukiNULLsuzuki@example.comsuzuki@example.com
TakahashiNULLNULLNot registered
  • หาก phone ไม่เป็น NULL ให้คืนค่า phone
  • หาก phone เป็น NULL และ email ไม่เป็น NULL ให้คืนค่า email
  • หากทั้ง phone และ email เป็น NULL ให้คืนค่า 'Not registered'

4.4 วิธีเลือกใช้ระหว่าง IFNULL กับ COALESCE

✔ เมื่อใดที่คุณควรใช้ IFNULL

เมื่อคุณต้องการการแทนที่ NULL ด้วยค่าตั้งต้นอย่างง่าย
เมื่อสองอาร์กิวเมนต์เพียงพอ (เช่น แปลง NULL เป็น 0)

✔ เมื่อใดที่คุณควรใช้ COALESCE

เมื่อคุณต้องการหาค่าที่ไม่เป็น NULL ตัวแรก (เช่น phone → email → “Not registered”)
เมื่อคุณต้องการประเมินสามค่าหรือมากกว่า

4.5 การเปรียบเทียบประสิทธิภาพระหว่าง IFNULL กับ COALESCE

โดยทั่วไป, IFNULL ทำงานเร็วกว่า COALESCE.
สาเหตุคือ IFNULL ประเมิน เพียงสองค่า เท่านั้น, ในขณะที่ COALESCE ประเมิน หลายค่าตามลำดับ.

การทดสอบประสิทธิภาพ

เมื่อใช้ IFNULL และ COALESCE กับแถวจำนวน 1 ล้านแถว, คุณอาจเห็นผลลัพธ์เช่นต่อไปนี้.

FunctionExecution time (seconds)
IFNULL0.02
COALESCE0.05

เมื่อข้อมูลมีขนาดใหญ่, IFNULL อาจเร็วกว่าเล็กน้อย.
➡ อย่างไรก็ตาม, หากคุณต้องการ fallback เพียงหนึ่งค่า, ใช้ IFNULL; หากต้องการหลายตัวเลือก, ใช้ COALESCE.

5. ฟังก์ชันการจัดการ NULL ในฐานข้อมูลที่ไม่ใช่ MySQL

MySQL มีฟังก์ชัน IFNULL เพื่อจัดการค่าที่เป็น NULL, แต่ระบบจัดการฐานข้อมูลอื่น (DBMS) ใช้ฟังก์ชันที่แตกต่างกัน.
ในฐานข้อมูลหลักเช่น Oracle, PostgreSQL, และ SQL Server, มักใช้ฟังก์ชันที่ต่างจาก MySQL สำหรับการจัดการ NULL.

ส่วนนี้อธิบาย วิธีที่ค่าที่เป็น NULL ถูกจัดการในฐานข้อมูลที่ไม่ใช่ MySQL.

5.1 การจัดการ NULL ใน Oracle: ฟังก์ชัน NVL

ใน Oracle, มี ฟังก์ชัน NVL ที่เทียบเท่ากับ IFNULL ของ MySQL.
ฟังก์ชัน NVL จะคืนค่าตัวอื่นเมื่อค่าที่ระบุเป็น NULL.

ไวยากรณ์

NVL(expression, fallback_value)
  • expression : คอลัมน์หรือค่าที่ต้องตรวจสอบว่าเป็น NULL
  • fallback_value : ค่าที่จะคืนเมื่อเป็น NULL (หากไม่เป็น NULL, จะคืนค่า expression ตามเดิม)

ตัวอย่าง

SELECT name, NVL(salary, 0) AS salary
FROM employees;

ผลลัพธ์

namesalary
Sato5000
Suzuki0
Takahashi8000

พฤติกรรมของ NVL เกือบเหมือนกับ IFNULL ของ MySQL, ดังนั้นใน Oracle คุณสามารถใช้ NVL ได้โดยตรง.

5.2 การจัดการ NULL ใน PostgreSQL และ SQL Server: ฟังก์ชัน COALESCE

ใน PostgreSQL และ SQL Server, ฟังก์ชัน COALESCE ถูกใช้เพื่อแทนที่ค่าที่เป็น NULL ด้วยค่าทดแทน.
ฟังก์ชันนี้สามารถคืน ค่าที่ไม่เป็น NULL ตัวแรกจากหลายตัวเลือก.

ไวยากรณ์

COALESCE(expr1, expr2, ..., exprN)
  • ประเมินจากซ้ายไปขวาและคืนค่าที่ไม่เป็น NULL ตัวแรก
  • คืนค่า NULL หากอาร์กิวเมนต์ทั้งหมดเป็น NULL

ตัวอย่าง

SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;

ผลลัพธ์

namephoneemailcontact_info
Sato080-1234-5678satou@example.com080-1234-5678
SuzukiNULLsuzuki@example.comsuzuki@example.com
TakahashiNULLNULLNot registered

ตามที่แสดงด้านบน, ใน PostgreSQL และ SQL Server, การใช้ COALESCE ทำให้การจัดการ NULL มีความยืดหยุ่นมากกว่าการใช้ IFNULL ของ MySQL.

5.3 การเปรียบเทียบฟังก์ชันการจัดการ NULL ระหว่างฐานข้อมูลต่าง ๆ

DatabaseNULL-handling functionRole
MySQLIFNULL(expression, fallback_value)Convert NULL to a fallback value
OracleNVL(expression, fallback_value)Convert NULL to a fallback value (equivalent to IFNULL)
PostgreSQL / SQL ServerCOALESCE(expr1, expr2, ...)Return the first non-NULL value
  • การจัดการ NULL อย่างง่ายIFNULL (MySQL) หรือ NVL (Oracle)
  • เลือกค่าที่ดีที่สุดจากหลายตัวเลือกCOALESCE (PostgreSQL, SQL Server)

5.4 หมายเหตุเมื่อย้ายระบบระหว่าง DBMS ต่าง ๆ

เมื่อทำการย้ายระบบระหว่างฐานข้อมูลต่าง ๆ, คุณต้องใส่ใจความแตกต่างของฟังก์ชันการจัดการ NULL.
โดยเฉพาะอย่างยิ่งเมื่อย้ายจาก Oracle ไปยัง MySQL, คุณต้องเขียนใหม่ NVL เป็น IFNULL.

ตัวอย่างการเขียนใหม่ระหว่างการย้าย

  • Oracle (NVL)
    SELECT NVL(salary, 0) AS salary FROM employees;
    
  • MySQL (IFNULL)
    SELECT IFNULL(salary, 0) AS salary FROM employees;
    
  • PostgreSQL / SQL Server (COALESCE)
    SELECT COALESCE(salary, 0) AS salary FROM employees;
    

Also, because COALESCE can accept multiple arguments, it is more flexible than Oracle’s NVL or MySQL’s IFNULL.
During migration, it’s important to choose the correct function for the target database.

6. คำถามที่พบบ่อย (FAQ)

คำถามเกี่ยวกับฟังก์ชัน IFNULL ของ MySQL และการจัดการค่า NULL มีความสำคัญสำหรับนักพัฒนาและผู้ดูแลฐานข้อมูล
ส่วนนี้สรุป คำถามทั่วไปเกี่ยวกับ IFNULL.

คำถามที่ 1. ฟังก์ชัน IFNULL กับฟังก์ชัน NVL เป็นฟังก์ชันเดียวกันหรือไม่?

พวกมันให้ฟังก์ชันการทำงานที่เกือบเหมือนกัน แต่ชื่อฟังก์ชันจะแตกต่างกันตามฐานข้อมูล

DatabaseNULL-handling function
MySQLIFNULL(expression, fallback_value)
OracleNVL(expression, fallback_value)
PostgreSQL / SQL ServerCOALESCE(expr1, expr2, ...)

ใน MySQL ให้ใช้ IFNULL; ใน Oracle ให้ใช้ NVL เพื่อแปลงค่าที่เป็น NULL ให้เป็นค่าทดแทน

คำถามที่ 2. ความแตกต่างระหว่าง IFNULL กับ COALESCE คืออะไร?

IFNULL คืนค่าที่ไม่เป็น NULL ระหว่างสองอาร์กิวเมนต์, ส่วน COALESCE คืนค่าที่ไม่เป็น NULL ตัวแรกจากหลายอาร์กิวเมนต์

FunctionFeature
IFNULL(a, b)If a is NULL, return b (only two arguments)
COALESCE(a, b, c, ...)Evaluates left to right and returns the first non-NULL value

ตัวอย่าง

SELECT IFNULL(NULL, 'Fallback value'); -- Result: 'Fallback value'
SELECT COALESCE(NULL, NULL, 'First non-NULL value'); -- Result: 'First non-NULL value'

✔ เมื่อควรใช้ IFNULL
✅ คืนค่าตั้งต้นเฉพาะเมื่อเป็น NULL (เช่น หากเป็น NULL แล้วให้เป็น 0)
✅ เมื่อคุณเปรียบเทียบ สองค่า เท่านั้น

✔ เมื่อควรใช้ COALESCE
✅ ดึงค่าที่ไม่เป็น NULL ตัวแรก (เช่น โทรศัพท์ → อีเมล → ค่าตั้งต้น)
✅ เมื่อคุณต้องประเมิน สามค่าขึ้นไป

คำถามที่ 3. IFNULL สามารถใช้กับประเภทข้อมูลอื่นนอกจากตัวเลขได้หรือไม่?

ได้ IFNULL สามารถใช้กับสตริง, วันที่, ตัวเลข และอื่น ๆ

ตัวอย่างที่ 1: การใช้สตริง

SELECT name, IFNULL(email, 'Not registered') AS email
FROM users;

ตัวอย่างที่ 2: การใช้วันที่

SELECT name, IFNULL(last_login, '2000-01-01') AS last_login
FROM users;

อย่างไรก็ตาม การผสมประเภทข้อมูลที่ต่างกัน (เช่น ตัวเลขและสตริง) อาจทำให้เกิดข้อผิดพลาด ดังนั้นควรระมัดระวัง

SELECT IFNULL(100, 'Error'); -- May cause an error due to different data types

คำถามที่ 4. การใช้ IFNULL ทำให้ประสิทธิภาพลดลงหรือไม่?

โดยทั่วไป ผลกระทบต่อประสิทธิภาพจะน้อยมาก แต่เมื่อประมวลผลข้อมูลปริมาณมากอาจมีผล

  • IFNULL มักจะเร็วเพราะมัน ตรวจสอบแค่สองค่า เท่านั้น
  • อย่างไรก็ตาม การใช้ IFNULL อย่างหนักบนชุดข้อมูลขนาดใหญ่มาก (หลายล้านแถว) อาจ ส่งผลต่อการปรับแต่งดัชนี ในบางกรณี

🔹 เคล็ดลับการเพิ่มประสิทธิภาพ

  1. ตั้งค่าดัชนีอย่างเหมาะสม
  • คำสั่งเช่น IFNULL(column, 0) = 100 อาจทำให้ดัชนีไม่ถูกใช้ในบางกรณี
  • วิธีหนึ่งคือการเก็บค่าพร้อมค่าตั้งต้นที่เหมาะสมแทนการใช้ NULL ตั้งแต่ต้น
  1. IFNULL มีน้ำหนักเบากว่า COALESCE
  • เนื่องจาก COALESCE ประเมินหลายค่าเป็นลำดับ IFNULL จึงอาจเร็วกว่าในหลายกรณี

คำถามที่ 5. สามารถใช้ CASE แทน IFNULL ได้หรือไม่?

ได้ คุณสามารถทำพฤติกรรมที่คล้ายกันด้วย CASE แต่จะยาวกว่า

ด้วย IFNULL

SELECT name, IFNULL(salary, 0) AS salary
FROM employees;

ด้วย CASE

SELECT name,
  CASE WHEN salary IS NULL THEN 0 ELSE salary END AS salary
FROM employees;

IFNULL สั้นและใช้งานง่าย
CASE รองรับเงื่อนไขที่ยืดหยุ่นมากขึ้น (เช่น คุณสามารถรวมเงื่อนไขที่ไม่เป็น NULL ได้ด้วย)

คำถามที่ 6. IFNULL สามารถใช้ในเงื่อนไข WHERE ได้หรือไม่?

ได้ IFNULL สามารถใช้ภายในเงื่อนไข WHERE

ตัวอย่าง: แทนที่ NULL ด้วยค่าที่กำหนดเมื่อทำการค้นหา

SELECT * FROM users WHERE IFNULL(status, 'Not set') = 'Not set';

นี่จะดึงบันทึกที่ status เป็น NULL

สรุป

  • IFNULL และ NVL มีฟังก์ชันการทำงานเกือบเหมือนกัน แต่แตกต่างกันตาม DBMS
  • IFNULL ประเมิน 2 ค่า; COALESCE ประเมินหลายค่า
  • ทำงานกับสตริง, วันที่, ตัวเลข, และอื่น ๆ
  • สำหรับชุดข้อมูลขนาดใหญ่ ควรพิจารณาการปรับแต่งดัชนี
  • คุณสามารถใช้ CASE แทน IFNULL
  • IFNULL ยังสามารถใช้ในเงื่อนไข WHERE

7. สรุป

ในบทความนี้ เราได้อธิบายฟังก์ชัน IFNULL ของ MySQL อย่างละเอียด รวมถึงวิธีจัดการค่าที่เป็น NULL, ความแตกต่างจากฟังก์ชันอื่น ๆ, และตัวอย่างการใช้งานจริง
สุดท้าย เราจะสรุปสั้น ๆ ว่าเราได้ครอบคลุมอะไรบ้าง

7.1 ฟังก์ชัน IFNULL คืออะไร?

  • IFNULL คืนค่าทดแทนเมื่อค่าที่ระบุเป็น NULL
  • ไวยากรณ์ :
    IFNULL(expression, fallback_value)
    
  • ด้วยการหลีกเลี่ยง NULL คุณสามารถป้องกันข้อผิดพลาดในการคำนวณและปัญหาข้อมูลหายได้

7.2 ตัวอย่างการใช้งาน IFNULL อย่างเป็นรูปธรรม

  • แทนที่ NULL ด้วยค่าดีฟอลต์ (0 หรือสตริงเฉพาะ)
    SELECT name, IFNULL(bonus, 0) AS bonus FROM employees;
    
  • จัดการการคำนวณที่มี NULL อย่างถูกต้อง
    SELECT name, salary + IFNULL(bonus, 0) AS total_income FROM employees;
    
  • แปลง NULL ให้เป็นสตริงที่เหมาะสม เช่น “ยังไม่ได้ลงทะเบียน”
    SELECT id, IFNULL(email, 'Not registered') AS email FROM users;
    
  • ใช้ในเงื่อนไข WHERE เพื่อกรองค่าที่เป็น NULL
    SELECT * FROM users WHERE IFNULL(status, 'Not set') = 'Not set';
    

7.3 ความแตกต่างระหว่าง IFNULL กับ COALESCE

  • IFNULL คืนค่าที่ไม่เป็น NULL ระหว่างสองอาร์กิวเมนต์
  • COALESCE คืนค่าที่ไม่เป็น NULL ตัวแรกจากหลายอาร์กิวเมนต์
  • วิธีเลือกใช้
  • การจัดการ NULL อย่างง่าย → IFNULL
  • เลือกค่าที่ไม่เป็น NULL ตัวแรก → COALESCE

7.4 การจัดการ NULL ใน DBMS อื่น ๆ

DatabaseNULL-handling function
MySQLIFNULL(expression, fallback_value)
OracleNVL(expression, fallback_value)
PostgreSQL / SQL ServerCOALESCE(expr1, expr2, ...)
  • NVL ของ Oracle มีลักษณะคล้ายกับ IFNULL ของ MySQL มาก
  • PostgreSQL และ SQL Server มักใช้ COALESCE
  • ในระหว่างการย้ายฐานข้อมูล คุณต้องแทนที่ฟังก์ชันให้เหมาะสม

7.5 ประสิทธิภาพและข้อควรระวังของ IFNULL

  • IFNULL มีน้ำหนักเบากว่า COALESCE
  • กับชุดข้อมูลขนาดใหญ่ ประสิทธิภาพอาจลดลงหากการปรับดัชนีได้รับผลกระทบ
  • ระวังให้ประเภทข้อมูลสอดคล้องกัน (อย่าผสมประเภทตัวเลขกับสตริง)

7.6 ข้อสรุปสุดท้าย

  • ใน MySQL ใช้ IFNULL เพื่อจัดการ NULL อย่างถูกต้อง
  • คุณสามารถประมวลผลข้อมูลโดยไม่ต้องกังวลกับ NULL
  • เข้าใจความแตกต่างระหว่าง COALESCE และ NVL แล้วเลือกใช้ฟังก์ชันที่เหมาะสม
  • เมื่อย้ายฐานข้อมูลระหว่างระบบ ควรใส่ใจความแตกต่างของฟังก์ชันการจัดการ NULL