0Pricing
SQL Academy · บทเรียน

นิพจน์ 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
END

CASE คืนค่า

แนวคิดสำคัญคือ นิพจน์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. นิพจน์ CASE
  2. CASE แบบค้นหาเทียบกับแบบง่าย
  3. การจัดกลุ่มช่วงและติดป้ายข้อมูล
  4. CASE ใน ORDER BY และการรวมค่า
← กลับไปที่ SQL Academy