นิพจน์ CASE
ตรรกะ IF/THEN ภายในคำค้น
นิพจน์ CASE เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
ตรรกะแบบแยกแขนงในเอสคิวแอล
บางครั้งคุณต้องการให้คำสั่งสืบค้นตัดสินใจ: ถ้าเป็นเช่นนี้ ก็ให้ทำเช่นนั้น มิฉะนั้นให้ทำอย่างอื่น เอสคิวแอลมีนิพจน์ CASE สำหรับงานนี้โดยเฉพาะ
CASE ช่วยให้คุณคืนค่าที่แตกต่างกันตามเงื่อนไขได้โดยตรงภายใน SELECT ลองนึกภาพว่านี่คือรูปแบบ if/else ของเอสคิวแอล
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
ELSE 'affordable'
END AS price_band
FROM products;โครงสร้างของ CASE
นิพจน์ CASE มีส่วนประกอบอยู่ไม่กี่ส่วน:
WHEN condition THEN value— หนึ่งแขนงหรือหลายแขนงELSE value— ค่าสำรองที่ไม่บังคับEND— ปิดนิพจน์ (จำเป็นต้องมี!)
เอสคิวแอลจะประเมินแขนง WHEN จากบนลงล่าง และคืนค่าของแขนงแรกที่เป็นจริง
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
ENDCASE คืนค่า
แนวคิดสำคัญคือ นิพจน์ CASE จะประเมินเป็นค่าเดียวต่อแถว เนื่องจากนิพจน์นี้สร้างค่าได้ คุณจึงใช้ได้ทุกที่ที่อนุญาตให้ใส่ค่า เช่น ในรายการ SELECT ใน WHERE ใน ORDER BY หรือแม้แต่ภายในฟังก์ชัน
ในที่นี้ นิพจน์จะกำหนดสถานะอย่างง่ายให้กับคำสั่งซื้อแต่ละรายการ
SELECT order_id,
CASE WHEN shipped_at IS NOT NULL THEN 'shipped'
WHEN paid_at IS NOT NULL THEN 'paid'
ELSE 'pending'
END AS status
FROM orders;เงื่อนไขที่ตรงกันข้อแรกมีผล
ลำดับมีความสำคัญ เอสคิวแอลจะตรวจสอบ WHEN แต่ละรายการตามลำดับ และหยุดที่รายการแรกที่เป็นจริง แขนงที่อยู่ถัดไปจะถูกละเว้น แม้ว่าจะตรงตามเงื่อนไขเช่นกัน
ด้านล่างนี้ คำสั่งซื้อที่มีมูลค่าเกิน 1000 จะเป็น 'มาก' และไม่มีทางเป็น 'ปานกลาง' เพราะแขนงแรกที่ตรงกันจะมีผล
SELECT order_id, total,
CASE WHEN total >= 1000 THEN 'large'
WHEN total >= 100 THEN 'medium'
ELSE 'small'
END AS size_band
FROM orders;แขนง ELSE
แขนง ELSE ครอบคลุมกรณีที่เหลือทั้งหมด หากไม่มีเงื่อนไข WHEN ใดเป็นจริง CASE จะคืนค่า ELSE
หากละเว้น ELSE และไม่มีเงื่อนไขใดตรงกัน CASE จะคืนค่า NULL นี่เป็นสาเหตุที่พบบ่อยของค่า NULL ที่ไม่คาดคิด ดังนั้นให้เพิ่ม ELSE อย่างชัดเจนเมื่อคุณต้องการค่าสำรองที่กำหนดไว้แน่นอน
SELECT name,
CASE WHEN stock = 0 THEN 'out of stock' END AS note
FROM products;
-- rows with stock > 0 get NULL in note (no ELSE)เงื่อนไขเป็นอะไรก็ได้
เงื่อนไข WHEN ก็คือนิพจน์แบบค่าจริงหรือเท็จ ซึ่งเป็นชนิดเดียวกับที่คุณเขียนในส่วนคำสั่ง WHERE คุณสามารถใช้การเปรียบเทียบ, AND, OR, BETWEEN, IN, LIKE และอื่น ๆ ได้
SELECT email,
CASE WHEN country IN ('US','CA') AND age >= 18 THEN 'eligible'
WHEN email LIKE '%@test.com' THEN 'test account'
ELSE 'review'
END AS segment
FROM users;ชนิดข้อมูลของผลลัพธ์ต้องเข้ากันได้
ทุกแขนงของ CASE ต้องคืนค่าชนิดข้อมูลที่เข้ากันได้ เนื่องจากคอลัมน์ต้องมีชนิดข้อมูลเดียว การผสมข้อความกับตัวเลขจะทำให้เกิดข้อผิดพลาดหรือการแปลงชนิดข้อมูลที่ไม่คาดคิด
หากต้องการให้แขนงหนึ่งเป็นตัวเลขและอีกแขนงเป็นข้อความ ให้แปลงชนิดข้อมูลอย่างชัดเจนเพื่อให้ชนิดข้อมูลสอดคล้องกัน
SELECT product_id,
CASE WHEN on_sale THEN price * 0.9
ELSE price
END AS effective_price -- all branches numeric: good
FROM products;การใช้ CASE ใน WHERE
เนื่องจาก CASE สร้างค่าได้ คุณจึงสามารถเปรียบเทียบผลลัพธ์ของมันภายในส่วนคำสั่ง WHERE ซึ่งมีประโยชน์สำหรับกฎการกรองแบบปรับเปลี่ยนได้
อย่างไรก็ตาม บ่อยครั้งตรรกะแบบค่าจริงหรือเท็จธรรมดาใน WHERE จะชัดเจนกว่า ควรเลือกใช้ CASE ใน WHERE เฉพาะเมื่อการแยกแขนงช่วยให้เงื่อนไขเข้าใจง่ายขึ้นอย่างแท้จริง
SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
ELSE total > 500
END;การซ้อน CASE
คุณสามารถวาง CASE ไว้ภายในแขนง CASE อื่นเพื่อแสดงตรรกะที่มีหลายชั้นได้ วิธีนี้ใช้ได้ แต่เมื่อนิพจน์ซ้อนกันลึกเกินไปจะอ่านได้ยาก
ควรซ้อนให้อยู่ในระดับตื้น หากเริ่มซับซ้อนขึ้น การใช้คอลัมน์แยกต่างหากหรือตารางค้นหามักจะสะอาดกว่า
SELECT order_id,
CASE WHEN region = 'EU' THEN
CASE WHEN total > 100 THEN 'EU big'
ELSE 'EU small' END
ELSE 'other'
END AS bucket
FROM orders;CASE ร่วมกับฟังก์ชันรวม
รูปแบบที่ทรงพลังคือการครอบ CASE ไว้ภายในฟังก์ชันรวม เช่น SUM หรือ COUNT วิธีนี้ช่วยให้นับหรือรวมแถวตามเงื่อนไขได้ในการประมวลผลรอบเดียว ซึ่งบางครั้งเรียกว่าการรวมแบบมีเงื่อนไขหรือตารางไขว้
SELECT
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 'shipped' THEN 1 ELSE 0 END) AS shipped,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM orders;CASE ที่คืนค่า NULL โดยตั้งใจ
การคืนค่า NULL จากแขนงหนึ่งบางครั้งเป็นสิ่งที่ต้องการพอดี เช่น ทำให้ค่าที่ไม่ต้องการแสดงว่างลง หรือส่งต่อให้ฟังก์ชันรวมภายหลังซึ่งไม่สนใจค่า NULL
ในที่นี้ เฉพาะคำสั่งซื้อขนาดใหญ่เท่านั้นที่เก็บยอดรวมไว้ ส่วนรายการอื่นจะกลายเป็น NULL เพื่อให้ AVG ข้ามรายการเหล่านั้น
SELECT order_id,
CASE WHEN total >= 1000 THEN total
ELSE NULL
END AS large_order_total
FROM orders;ตรวจสอบความเข้าใจ
พิจารณานิพจน์นี้สำหรับแถวที่ total = 1500:
CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END
นิพจน์นี้ส่งคืนค่าใด?
ทบทวน: นิพจน์ CASE
คุณได้เรียนรู้แก่นของตรรกะแบบมีเงื่อนไขในเอสคิวแอล:
CASE WHEN ... THEN ... ELSE ... ENDส่งคืนหนึ่งค่าต่อแถว- ระบบตรวจสอบแขนงจากบนลงล่าง โดย ผลที่ตรงกันรายการแรกจะเป็นผลที่เลือก
- หากไม่ระบุ
ELSEจะได้NULLเมื่อไม่มีสิ่งใดตรงกัน - แขนงทั้งหมดต้องส่งคืนชนิดข้อมูลที่เข้ากันได้
CASEใช้ได้ในSELECT,WHEREและภายในฟังก์ชันรวม
ถัดไป เราจะเปรียบเทียบรูปแบบไวยากรณ์ทั้งสองของ CASE
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
WHEN price > 20 THEN 'mid'
ELSE 'cheap'
END AS tier
FROM products;คำถามที่พบบ่อย
บทเรียน “นิพจน์ CASE” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “นิพจน์ CASE” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “นิพจน์ CASE”
ตรรกะ IF/THEN ภายในคำค้น คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “นิพจน์ CASE” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ