CASE แบบค้นหาเทียบกับแบบง่าย
สองวิธีในการเขียน CASE
CASE แบบค้นหาเทียบกับแบบง่าย เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
สองวิธีในการเขียน CASE
เอสคิวแอลมี CASE อยู่สองรูปแบบ: CASE แบบง่าย และ CASE แบบค้นหา ทั้งสองรูปแบบส่งคืนค่าตามเงื่อนไข แต่ต่างกันที่วิธีเขียนเงื่อนไขเหล่านั้น
เมื่อจบบทเรียนนี้ คุณจะทราบว่าควรเลือกใช้แต่ละรูปแบบเมื่อใด และจะหลีกเลี่ยงข้อผิดพลาดทั่วไปจากการใช้สลับกันได้อย่างไร
แนวคิดของ CASE แบบง่าย
CASE แบบง่าย จะเปรียบเทียบนิพจน์หนึ่งรายการกับรายการค่า ลองนึกภาพว่าเป็นตารางค้นหา: คุณเลือกคอลัมน์หรือค่าหนึ่งรายการทางด้านซ้าย จากนั้นระบุว่าแต่ละแขนง WHEN มีค่าใดที่เท่ากับค่านั้น
ไวยากรณ์: CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ELSE default END
SELECT
product_name,
category_id,
CASE category_id
WHEN 1 THEN 'Electronics'
WHEN 2 THEN 'Clothing'
WHEN 3 THEN 'Books'
ELSE 'Other'
END AS category_name
FROM products;CASE แบบง่ายในทางปฏิบัติ
ในที่นี้ นิพจน์ CASE อยู่ถัดจากคีย์เวิร์ดทันที และคอลัมน์ status จะถูกเปรียบเทียบกับค่า WHEN แต่ละค่าด้วยการตรวจสอบความเท่ากัน สังเกตว่าคุณ ไม่ ต้องเขียน status = ในแขนง WHEN — การเปรียบเทียบนั้นเป็นสิ่งที่ CASE กำหนดไว้โดยนัย
SELECT
order_id,
status,
CASE status
WHEN 'pending' THEN 'Awaiting payment'
WHEN 'paid' THEN 'Payment received'
WHEN 'shipped' THEN 'On its way'
WHEN 'delivered' THEN 'Completed'
ELSE 'Unknown status'
END AS status_label
FROM orders;แนวคิดของ CASE แบบค้นหา
CASE แบบค้นหา จะไม่มีนิพจน์อยู่ถัดจากคีย์เวิร์ด CASE ทันที แต่ละแขนง WHEN จะมีเงื่อนไขบูลีนแบบเต็มรูปแบบ ทำให้ยืดหยุ่นกว่ามาก: คุณสามารถผสมคอลัมน์ต่างกัน ใช้การตรวจสอบช่วงค่า หรือเรียกใช้ฟังก์ชันภายใน WHEN แต่ละแขนงได้
ไวยากรณ์: CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default END
SELECT
employee_name,
salary,
CASE
WHEN salary < 30000 THEN 'Entry Level'
WHEN salary < 60000 THEN 'Mid Level'
WHEN salary < 100000 THEN 'Senior'
ELSE 'Executive'
END AS salary_band
FROM employees;CASE แบบค้นหาในทางปฏิบัติ
เนื่องจาก WHEN แต่ละรายการยอมรับนิพจน์บูลีนใด ๆ คุณจึงรวมหลายคอลัมน์ไว้ในแขนงเดียวได้ ฐานข้อมูลจะประเมินส่วนคำสั่ง WHEN จากบนลงล่าง และส่งคืนผลลัพธ์ของแขนง แรก ที่เป็น TRUE
SELECT
product_name,
stock,
price,
CASE
WHEN stock = 0 THEN 'Out of stock'
WHEN stock < 10 AND price > 100 THEN 'Low stock — premium item'
WHEN stock < 10 THEN 'Low stock'
ELSE 'In stock'
END AS availability
FROM products;ความแตกต่างเชิงโครงสร้างที่สำคัญ
ตารางด้านล่างสรุปความแตกต่างสำคัญ:
CASE แบบง่าย — มีนิพจน์หนึ่งรายการหลัง CASE และ WHEN แต่ละรายการจะตรวจสอบความเท่ากันกับนิพจน์นั้น
CASE แบบค้นหา — ไม่มีนิพจน์หลัง CASE และ WHEN แต่ละรายการเป็นเงื่อนไขบูลีนแบบอิสระ
เนื่องจาก CASE แบบง่ายตรวจสอบได้เฉพาะความเท่ากัน จึงจัดการช่วงค่า, NULL หรือเงื่อนไขหลายคอลัมน์ไม่ได้ สำหรับกรณีใดก็ตามที่เกินกว่าการตรวจสอบค่าที่ตรงกันโดยตรง ให้ใช้ CASE แบบค้นหา
-- Simple CASE: equality only
SELECT CASE day_number
WHEN 1 THEN 'Monday'
WHEN 2 THEN 'Tuesday'
ELSE 'Other'
END AS day_name
FROM schedule;
-- Searched CASE: any condition
SELECT CASE
WHEN day_number BETWEEN 1 AND 5 THEN 'Weekday'
WHEN day_number IN (6, 7) THEN 'Weekend'
END AS day_type
FROM schedule;การจัดการ NULL — เหตุใด CASE แบบค้นหาจึงเหนือกว่า
CASE แบบง่ายใช้ = ภายใน และ NULL = NULL จะไม่มีทางเป็น TRUE ในเอสคิวแอล ดังนั้น CASE แบบง่ายจึงไม่สามารถจับคู่กับคอลัมน์ที่เป็น NULL ได้ ส่วน CASE แบบค้นหาช่วยให้คุณเขียน WHEN column IS NULL THEN ... ซึ่งทำงานได้อย่างถูกต้อง
-- Simple CASE: NULL branch never matches
SELECT CASE manager_id
WHEN NULL THEN 'No manager' -- this will NEVER fire
ELSE 'Has manager'
END
FROM employees;
-- Searched CASE: correct NULL check
SELECT CASE
WHEN manager_id IS NULL THEN 'No manager'
ELSE 'Has manager'
END AS manager_status
FROM employees;การผสมคอลัมน์ใน CASE แบบค้นหา
จุดแข็งสำคัญของ CASE แบบค้นหาคือแขนง WHEN แต่ละรายการสามารถอ้างอิงคอลัมน์ที่แตกต่างกันโดยสิ้นเชิง หรือเรียกใช้ฟังก์ชันได้ ทำให้คุณเขียนกฎทางธุรกิจที่ซับซ้อน ซึ่ง CASE แบบง่ายจัดการไม่ได้เลย
SELECT
customer_name,
total_orders,
total_spent,
CASE
WHEN total_spent > 10000 AND total_orders > 20 THEN 'VIP'
WHEN total_spent > 5000 THEN 'Gold'
WHEN total_orders > 10 THEN 'Silver'
ELSE 'Standard'
END AS tier
FROM customers;การใช้ CASE ใน ORDER BY
CASE ทั้งสองรูปแบบสามารถอยู่ภายใน ORDER BY เพื่อสร้างลำดับการเรียงแบบกำหนดเองที่ไม่มีอยู่ในข้อมูลได้ ในที่นี้ CASE แบบง่ายจะแปลงชื่อระดับความสำคัญเป็นตัวเลข เพื่อให้แถวเรียงตามลำดับความสำคัญทางธุรกิจ ไม่ใช่ตามลำดับตัวอักษร
SELECT ticket_id, subject, priority
FROM support_tickets
ORDER BY
CASE priority
WHEN 'critical' THEN 1
WHEN 'high' THEN 2
WHEN 'medium' THEN 3
WHEN 'low' THEN 4
ELSE 5
END ASC;CASE ภายในฟังก์ชันรวม
การครอบ CASE แบบค้นหาไว้ภายใน SUM หรือ COUNT เป็นรูปแบบคลาสสิกสำหรับการรวมแบบมีเงื่อนไข ซึ่งบางครั้งเรียกว่าการทำตารางไขว้ วิธีนี้ช่วยให้คุณสร้างยอดรวมหลายหมวดหมู่ในการอ่านข้อมูลรอบเดียว แทนการเรียกใช้หลายคำสั่งสอบถาม
SELECT
department,
COUNT(*) AS total_employees,
SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS female_count,
SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS male_count,
SUM(CASE WHEN salary > 70000 THEN salary ELSE 0 END) AS high_earner_payroll
FROM employees
GROUP BY department;การเลือกรูปแบบที่เหมาะสม
หลักปฏิบัติง่าย ๆ:
ใช้ CASE แบบง่าย เมื่อคุณกำลังจับคู่คอลัมน์เดียวกับชุดค่าที่ทราบแน่นอน — รูปแบบนี้สั้นกว่าและอ่านง่ายกว่า
ใช้ CASE แบบค้นหา สำหรับกรณีอื่นทั้งหมด: ช่วงค่า การตรวจสอบ NULL ตรรกะหลายคอลัมน์ หรือการเรียกใช้ฟังก์ชันภายในเงื่อนไข
หากไม่แน่ใจ CASE แบบค้นหาใช้ได้เสมอ คุณสามารถเขียน CASE แบบง่ายใหม่เป็น CASE แบบค้นหาได้ทุกรูปแบบ แต่ทำกลับกันไม่ได้
-- These two queries return identical results
-- Simple CASE (concise for equality)
SELECT CASE region_code
WHEN 'US' THEN 'United States'
WHEN 'UK' THEN 'United Kingdom'
ELSE 'International'
END AS region_name
FROM sales;
-- Equivalent Searched CASE
SELECT CASE
WHEN region_code = 'US' THEN 'United States'
WHEN region_code = 'UK' THEN 'United Kingdom'
ELSE 'International'
END AS region_name
FROM sales;ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจของคุณเกี่ยวกับ CASE แบบง่ายและ CASE แบบค้นหา
ทบทวนบทเรียน
นี่คือสิ่งที่คุณได้เรียนรู้ในบทเรียนนี้:
CASE แบบง่าย — วางนิพจน์หนึ่งรายการหลัง CASE โดย WHEN แต่ละรายการจะตรวจสอบว่านิพจน์นั้นเท่ากับค่าใดค่าหนึ่งหรือไม่ เหมาะที่สุดสำหรับการจับคู่คอลัมน์เดียวกับรายการป้ายกำกับที่กำหนดไว้
CASE แบบค้นหา — ไม่มีนิพจน์หลัง CASE โดย WHEN แต่ละรายการมีเงื่อนไขบูลีนแบบเต็มรูปแบบ รองรับช่วงค่า การตรวจสอบ NULL ตรรกะหลายคอลัมน์ และการเรียกใช้ฟังก์ชัน
ทั้งสองรูปแบบจะประเมินแขนงจากบนลงล่าง และส่งคืนผลลัพธ์ของแขนงแรกที่เป็น TRUE เมื่อไม่มีแขนงใดตรงกันและไม่มี ELSE ผลลัพธ์จะเป็น NULL หากต้องการความยืดหยุ่นสูงสุด CASE แบบค้นหาเป็นตัวเลือกที่ปลอดภัยเสมอ เพราะทำได้ทุกอย่างที่ CASE แบบง่ายทำได้ และยังทำได้มากกว่านั้น
คำถามที่พบบ่อย
บทเรียน “CASE แบบค้นหาเทียบกับแบบง่าย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “CASE แบบค้นหาเทียบกับแบบง่าย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “CASE แบบค้นหาเทียบกับแบบง่าย”
สองวิธีในการเขียน CASE คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “CASE แบบค้นหาเทียบกับแบบง่าย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- นิพจน์ CASE
- CASE แบบค้นหาเทียบกับแบบง่าย
- การจัดกลุ่มช่วงและติดป้ายข้อมูล
- CASE ใน ORDER BY และการรวมค่า