0Pricing
SQL Interview Prep · บทเรียน

COALESCE, NULLIF และ ISNULL

แทนค่าดีฟอลต์และความแตกต่างระหว่าง COALESCE กับฟังก์ชันเฉพาะของผู้ให้บริการ

COALESCE, NULLIF และ ISNULL เป็นบทเรียน SQL Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

การแทนค่าของ NULL ด้วยค่าอื่น

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

นอกจากนี้คุณจะได้พบกับ NULLIF ซึ่งทำงานในทิศทางตรงกันข้าม โดยเปลี่ยนค่าที่ระบุให้เป็น NULL และฟังก์ชันเฉพาะผู้ผลิตอย่าง ISNULL (SQL Server) กับ IFNULL (MySQL) ซึ่งผู้สมัครมักสับสนกับ COALESCE

การรู้ความแตกต่างของแต่ละตัวอย่างแน่ชัด โดยเฉพาะจำนวนอาร์กิวเมนต์และชนิดค่าที่คืนกลับ เป็นคำถามคัดกรองที่พบบ่อย

พื้นฐานของ COALESCE

COALESCE รับอาร์กิวเมนต์ได้จำนวนเท่าใดก็ได้ และคืนค่า ตัวแรกที่ไม่ใช่ NULL โดยไล่ตรวจจากซ้ายไปขวา หากอาร์กิวเมนต์ทั้งหมดเป็น NULL ก็จะคืนค่า NULL

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

-- Show 0 instead of NULL for missing bonuses
SELECT name, COALESCE(bonus, 0) AS bonus
FROM employees;

-- Multiple fallbacks, first non-NULL wins
SELECT COALESCE(mobile_phone, home_phone, 'no phone') AS contact
FROM customers;

COALESCE ประเมินแบบหยุดเมื่อพบค่า

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

ในทางปฏิบัติ ตัวเพิ่มประสิทธิภาพของบางระบบอาจยังประเมินค่าล่วงหน้าอยู่ ดังนั้นอย่าพึ่งพาพฤติกรรมนี้เพื่อป้องกันข้อผิดพลาด เช่น การหารด้วยศูนย์ แต่ลำดับความสำคัญจากซ้ายไปขวาว่าค่าใดจะถูกเลือกนั้นรับประกันได้

-- Prefer the manual override, else the computed value,
-- else a constant default
SELECT COALESCE(manual_price, list_price * 1.1, 9.99) AS price
FROM products;

ชนิดข้อมูลผลลัพธ์ของ COALESCE

ข้อควรระวังที่ละเอียดอ่อนคือ ชนิดข้อมูลของผลลัพธ์จาก COALESCE ถูกกำหนดโดย ลำดับความสำคัญของชนิดข้อมูลของอาร์กิวเมนต์ทั้งหมดรวมกัน ไม่ใช่แค่อาร์กิวเมนต์ตัวแรก การผสมชนิดข้อมูลที่เข้ากันไม่ได้อาจทำให้เกิดข้อผิดพลาดหรือการตัดทอนที่ไม่คาดคิด

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

-- Risky: integer column with a string fallback
-- may error or force a cast depending on dialect
SELECT COALESCE(score, 'N/A') FROM tests;

-- Safer: keep the fallback type-compatible, or cast explicitly
SELECT COALESCE(CAST(score AS VARCHAR), 'N/A') FROM tests;

ISNULL (SQL Server) เทียบกับ COALESCE

SQL Server มี ISNULL(expr, replacement) ซึ่งดูคล้ายกับ COALESCE แต่มีความแตกต่างสำคัญที่ผู้สัมภาษณ์ชอบนำมาเปรียบเทียบ:

  • จำนวนอาร์กิวเมนต์: ISNULL รับอาร์กิวเมนต์สองตัวพอดี ส่วน COALESCE รับได้หลายตัว
  • ชนิดค่าที่คืนกลับ: ISNULL ใช้ชนิดของอาร์กิวเมนต์ ตัวแรก ซึ่งอาจทำให้ค่าทดแทนถูกตัดทอน ส่วน COALESCE ใช้ลำดับความสำคัญของชนิดข้อมูลรวมกัน
  • การใช้ข้ามระบบ: ISNULL ใช้ได้เฉพาะ SQL Server ส่วน COALESCE เป็นมาตรฐาน ANSI

คำแนะนำที่ควรกล่าวออกมาคือ ให้เลือกใช้ COALESCE เพื่อการใช้ข้ามระบบและการกำหนดชนิดข้อมูลที่คาดเดาได้

-- SQL Server: ISNULL may truncate the replacement to
-- the first argument's type (e.g. CHAR(1))
SELECT ISNULL(code, 'UNKNOWN') FROM items;
-- If code is CHAR(1), 'UNKNOWN' becomes 'U'

-- COALESCE picks the wider type and keeps 'UNKNOWN'
SELECT COALESCE(code, 'UNKNOWN') FROM items;

IFNULL และ NVL

รูปแบบ SQL อื่นมีรูปแบบย่อที่รับอาร์กิวเมนต์สองตัวเป็นของตนเอง:

  • MySQL / SQLite: IFNULL(expr, replacement)
  • Oracle: NVL(expr, replacement) และยังมี NVL2 สำหรับการเลือกค่าตามกรณีเป็นจริงหรือเป็นเท็จ

ทั้งสามตัวทำงานเหมือน COALESCE ที่รับอาร์กิวเมนต์สองตัว หากถูกถามถึงรูปแบบที่นิยมใช้ใน MySQL หรือ Oracle โดยเฉพาะ ให้เอ่ยชื่อเหล่านี้ แต่หากไม่ได้ระบุระบบ ให้เลือกใช้ COALESCE

-- MySQL
SELECT IFNULL(bonus, 0) FROM employees;

-- Oracle
SELECT NVL(bonus, 0) FROM employees;
-- NVL2(bonus, 'has bonus', 'no bonus') -> if/else on NULL

NULLIF: การทำงานในทิศทางตรงกันข้าม

NULLIF(a, b) จะคืนค่า NULL เมื่อ a = b มิฉะนั้นจะคืนค่า a ฟังก์ชันนี้จงใจ สร้าง ค่า NULL ซึ่งตรงข้ามกับ COALESCE

การใช้งานที่มีชื่อเสียงที่สุดคือการป้องกันการหารด้วยศูนย์ ให้ครอบตัวหารด้วย NULLIF(denominator, 0) หากตัวหารเป็นศูนย์ ตัวหารจะกลายเป็น NULL และผลการหารทั้งหมดจะเป็น NULL แทนที่จะทำให้เกิดข้อผิดพลาด

-- Avoid divide-by-zero: returns NULL instead of erroring
SELECT revenue / NULLIF(orders, 0) AS avg_order_value
FROM daily_stats;

-- NULLIF(5, 5) -> NULL
-- NULLIF(5, 3) -> 5

การใช้ NULLIF ร่วมกับ COALESCE

ฟังก์ชันทั้งสองทำงานร่วมกันได้อย่างลงตัว ตัวอย่างนิพจน์บรรทัดเดียวที่ใช้บ่อยในการสัมภาษณ์คือ “การหารอย่างปลอดภัยที่แสดงค่า 0 เมื่อไม่มีคำสั่งซื้อ” ใช้ NULLIF เพื่อหลีกเลี่ยงข้อผิดพลาด แล้วใช้ COALESCE เพื่อแทนค่า NULL ที่ได้

รูปแบบย่อนี้แสดงว่าคุณจัดการทั้งกรณีขอบและการนำเสนอผลลัพธ์ได้ในนิพจน์เดียว

SELECT
  COALESCE(revenue / NULLIF(orders, 0), 0) AS avg_order_value
FROM daily_stats;

-- orders = 0 -> NULLIF gives NULL -> division gives NULL
-- -> COALESCE turns it into 0

การจัดการสตริงว่างให้เป็น NULL

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

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

-- Treat both '' and NULL as missing, default to 'Anonymous'
SELECT COALESCE(NULLIF(TRIM(username), ''), 'Anonymous')
FROM users;

ตัวอย่างเชิงลึก: การใช้ COALESCE ข้ามการ JOIN

หลังการใช้ LEFT JOIN แถวที่ไม่พบคู่จะทำให้คอลัมน์ด้านขวามีค่า NULL COALESCE จะเปลี่ยนค่าเหล่านั้นเป็นค่าเริ่มต้นที่มีความหมายในผลลัพธ์ ซึ่งเป็นความต้องการของรายงานที่พบได้บ่อยมาก

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

SELECT
  c.name,
  COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Customers with no orders get 0 instead of NULL

ประเด็นสำหรับพูดในการสัมภาษณ์

สรุปชุดเครื่องมือสำหรับการแทนค่า:

  • COALESCE(a, b, ...): คืนค่าตัวแรกที่ไม่ใช่ NULL รับได้หลายอาร์กิวเมนต์ เป็นมาตรฐาน ANSI และกำหนดชนิดข้อมูลตามลำดับความสำคัญ เป็นตัวเลือกเริ่มต้น
  • ISNULL / IFNULL / NVL: รูปแบบย่อของผู้ผลิตที่รับอาร์กิวเมนต์สองตัว โดย ISNULL อาจตัดทอนค่าให้เหลือชนิดของอาร์กิวเมนต์แรก
  • NULLIF(a, b): คืนค่า NULL เมื่อค่าเท่ากัน เหมาะสำหรับป้องกันการหารด้วยศูนย์และปรับสตริงว่างให้เป็นมาตรฐาน
  • ใช้ COALESCE(x / NULLIF(y, 0), 0) ร่วมกันเพื่อให้ได้การหารที่ปลอดภัยและนำเสนอผลลัพธ์ได้เหมาะสม

เริ่มต้นด้วย COALESCE และกล่าวถึงรูปแบบเฉพาะผู้ผลิตเมื่อระบุระบบที่ใช้ไว้อย่างชัดเจนเท่านั้น

ตรวจสอบความเข้าใจอย่างรวดเร็ว

เลือกนิพจน์การหารที่ปลอดภัย

ทบทวน

ตอนนี้คุณสามารถแทนค่าและสร้าง NULL ได้แล้ว:

  • COALESCE คืนค่าตัวแรกที่ไม่ใช่ NULL จากอาร์กิวเมนต์หลายตัว และเป็นค่าเริ่มต้นที่ใช้ข้ามระบบได้
  • ISNULL (SQL Server), IFNULL (MySQL) และ NVL (Oracle) เป็นรูปแบบย่อที่รับอาร์กิวเมนต์สองตัว โดย ISNULL อาจตัดทอนค่าให้เหลือชนิดของอาร์กิวเมนต์แรก
  • NULLIF(a, b) คืนค่า NULL เมื่อค่าทั้งสองเท่ากัน เหมาะสำหรับป้องกันการหารด้วยศูนย์และปรับสตริงว่างให้เป็นมาตรฐาน
  • ใช้ฟังก์ชันเหล่านี้ร่วมกันเพื่อสร้างนิพจน์ที่ปลอดภัยและนำเสนอผลลัพธ์ได้เหมาะสม รวมถึงแทนค่า NULL ที่เกิดหลัง LEFT JOIN

บทเรียนสุดท้าย: พฤติกรรมของ NULL ภายในฟังก์ชันรวม การเชื่อมตาราง และ DISTINCT

คำถามที่พบบ่อย

บทเรียน “COALESCE, NULLIF และ ISNULL” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “COALESCE, NULLIF และ ISNULL” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “COALESCE, NULLIF และ ISNULL”

แทนค่าดีฟอลต์และความแตกต่างระหว่าง COALESCE กับฟังก์ชันเฉพาะของผู้ให้บริการ คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “COALESCE, NULLIF และ ISNULL” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Interview Prep นี้ได้ไหม

ได้ บทเรียน SQL Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ตรรกะสามค่าและ UNKNOWN
  2. IS NULL, IS NOT NULL และความเท่าเทียบที่ปลอดภัยต่อ NULL
  3. COALESCE, NULLIF และ ISNULL
  4. NULL ในฟังก์ชันรวม การเชื่อมตาราง และ DISTINCT
← กลับไปที่ SQL Interview Prep