คำชี้แจงกรณีใน Oracle PL/SQL พร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
คำสั่ง CASE ใน PL/SQL เลือกทางเลือกหนึ่งจากหลายทางเลือกโดยอิงจากตัวเลือก (selector) คล้ายกับ IF-THEN-ELSIF แต่ชัดเจนกว่า CASE แบบธรรมดาจะจับคู่ค่าในตัวเลือก ในขณะที่ CASE แบบค้นหาจะประเมินเงื่อนไขในแต่ละส่วนของ WHEN และเรียกใช้เงื่อนไขแรกที่เป็นจริง

คำสั่ง CASE คืออะไร?
คำสั่ง CASE คล้ายกับคำสั่ง IF-THEN-ELSIF ตรงที่มันจะเลือกทางเลือกหนึ่งโดยพิจารณาจากเงื่อนไขในตัวเลือกที่มีอยู่
- คำสั่ง CASE ใช้ "ตัวเลือก" (selector) แทนที่จะใช้ค่าบูลีน (Boolean expression) ในการเลือกซีเควนซ์
- ค่าของนิพจน์ในคำสั่ง CASE จะถูกตีความว่าเป็นตัวเลือก (selector)
- นิพจน์นั้นอาจเป็นประเภทใดก็ได้ (เช่น การคำนวณทางคณิตศาสตร์ ตัวแปร ฯลฯ)
- แต่ละทางเลือกจะได้รับการกำหนดค่าที่กำหนดไว้ล่วงหน้า (ตัวเลือก) และทางเลือกที่มีค่าตัวเลือกตรงกับค่าของนิพจน์เงื่อนไขจะถูกดำเนินการ
- ต่างจาก IF-THEN-ELSIF ตรงที่คำสั่ง CASE สามารถใช้ในคำสั่ง SQL ได้เช่นกัน
- ส่วน ELSE ในคำสั่ง CASE จะเก็บลำดับการทำงานเมื่อไม่มีทางเลือกใดถูกเลือก
วากยสัมพันธ์
CASE (expression) WHEN <value1> THEN action_block1; WHEN <value2> THEN action_block2; WHEN <value3> THEN action_block3; ELSE action_block_default; END CASE;
- ในไวยากรณ์ข้างต้น นิพจน์จะส่งคืนค่าซึ่งอาจเป็นประเภทใดก็ได้
- แต่ละประโยคย่อย 'เมื่อ' เป็นทางเลือกที่มี และ .
- เงื่อนไข 'WHEN' ที่มีค่าตรงกับนิพจน์จะถูกเลือก และเงื่อนไขนั้นจะถูกนำไปใช้ ถูกดำเนินการแล้ว
- บล็อก 'ELSE' เป็นตัวเลือกเสริมและใช้สำหรับเก็บข้อมูล ดำเนินการเมื่อไม่มีตัวเลือกอื่นที่ตรงกัน
- 'END' เป็นคำที่ใช้ระบุจุดสิ้นสุดของคำสั่ง CASE และเป็นส่วนที่จำเป็นของคำสั่ง CASE
ตัวอย่างที่ 1: การคำนวณทางคณิตศาสตร์โดยใช้คำสั่ง CASE
ในตัวอย่างนี้ เราจะทำการคำนวณทางคณิตศาสตร์ระหว่างตัวเลขสองตัว คือ 55 และ 5
DECLARE a NUMBER := 55; b NUMBER := 5; arth_operation VARCHAR2(20) := 'MULTIPLY'; BEGIN dbms_output.put_line('Program started.'); CASE (arth_operation) WHEN 'ADD' THEN dbms_output.put_line('Addition of the numbers are: '|| a+b ); WHEN 'SUBTRACT' THEN dbms_output.put_line('Subtraction of the numbers are: '||a-b ); WHEN 'MULTIPLY' THEN dbms_output.put_line('Multiplication of the numbers are: '|| a*b ); WHEN 'DIVIDE' THEN dbms_output.put_line('Division of the numbers are:'|| a/b); ELSE dbms_output.put_line('No operation action defined. Invalid operation'); END CASE; dbms_output.put_line('Program completed.'); END; /
Code คำอธิบาย
- Code บรรทัดที่ 2: ประกาศตัวแปร 'a' เป็นชนิด 'NUMBER' และกำหนดค่าเริ่มต้นเป็น '55'
- Code บรรทัดที่ 3: ประกาศตัวแปร 'b' เป็นชนิด 'NUMBER' และกำหนดค่าเริ่มต้นเป็น '5'
- Code บรรทัดที่ 4: ประกาศตัวแปร 'arth_operation' เป็น 'VARCHAR2' ขนาด 20 และกำหนดค่าเริ่มต้นเป็น 'MULTIPLY'
- Code บรรทัดที่ 6: พิมพ์ข้อความ “โปรแกรมเริ่มต้นแล้ว”
- Code บรรทัดที่ 7: คำสั่ง CASE ตรวจสอบค่าของนิพจน์ ในที่นี้ ค่าของ 'arth_operation' คือ 'MULTIPLY' ซึ่งถือว่าเป็นตัวเลือก (selector)
- Code บรรทัดที่ 10: เงื่อนไข WHEN ที่มีค่าเป็น 'MULTIPLY' ตรงกับตัวเลือก ดังนั้นตัวควบคุมจึงเลือกบล็อกการกระทำนี้และพิมพ์ 'ผลคูณของตัวเลขคือ: 275'
- Code บรรทัดที่ 13: แสดงถึงจุดสิ้นสุดของคำสั่ง CASE
- Code บรรทัดที่ 14: พิมพ์ข้อความ “โปรแกรมเสร็จสมบูรณ์”
Code เอาท์พุต
Program started. Multiplication of the numbers are: 275 Program completed.
คำชี้แจงกรณีที่ค้นหา
คำสั่ง CASE ที่ค้นหานั้นคล้ายกับคำสั่ง CASE ทั่วไป แต่แทนที่จะใช้ตัวเลือกเพื่อเลือกทางเลือกอื่น คำสั่ง CASE ที่ค้นหานั้นจะมีเงื่อนไขที่กำหนดไว้โดยตรงในส่วน WHEN
- คำสั่ง WHEN แรกที่ตรงตามเงื่อนไขจะถูกดำเนินการ และตัวควบคุมจะข้ามทางเลือกอื่นๆ ที่เหลือ
วากยสัมพันธ์
CASE WHEN <expression1> THEN action_block1; WHEN <expression2> THEN action_block2; WHEN <expression3> THEN action_block3; ELSE action_block_default; END CASE;
- ในไวยากรณ์ข้างต้น เงื่อนไข WHEN แต่ละข้อจะมีส่วนแยกกัน และ .
- เงื่อนไข WHEN ที่นิพจน์ส่งค่ากลับเป็น TRUE จะถูกดำเนินการ
- บล็อก 'ELSE' เป็นตัวเลือกเสริมและใช้สำหรับเก็บข้อมูล ดำเนินการเมื่อไม่มีทางเลือกใดที่เหมาะสม
- 'END' เป็นคำที่ใช้ระบุจุดสิ้นสุดของคำสั่ง CASE และเป็นส่วนที่จำเป็นของคำสั่ง CASE
ตัวอย่างที่ 1: การคำนวณทางคณิตศาสตร์โดยใช้คำสั่ง CASE ที่ค้นหา
ในตัวอย่างนี้ เราจะทำการคำนวณทางคณิตศาสตร์ระหว่างตัวเลขสองตัว คือ 55 และ 5
DECLARE a NUMBER := 55; b NUMBER := 5; arth_operation VARCHAR2(20) := 'DIVIDE'; BEGIN dbms_output.put_line('Program started.'); CASE WHEN arth_operation = 'ADD' THEN dbms_output.put_line('Addition of the numbers are: '||a+b ); WHEN arth_operation = 'SUBTRACT' THEN dbms_output.put_line('Subtraction of the numbers are: '|| a-b); WHEN arth_operation = 'MULTIPLY' THEN dbms_output.put_line('Multiplication of the numbers are: '|| a*b ); WHEN arth_operation = 'DIVIDE' THEN dbms_output.put_line('Division of the numbers are: '|| a/b ); ELSE dbms_output.put_line('No operation action defined. Invalid operation'); END CASE; dbms_output.put_line('Program completed.'); END; /
Code คำอธิบาย
- Code บรรทัดที่ 2: ประกาศตัวแปร 'a' เป็นชนิด 'NUMBER' และกำหนดค่าเริ่มต้นเป็น '55'
- Code บรรทัดที่ 3: ประกาศตัวแปร 'b' เป็นชนิด 'NUMBER' และกำหนดค่าเริ่มต้นเป็น '5'
- Code บรรทัดที่ 4: ประกาศตัวแปร 'arth_operation' เป็น 'VARCHAR2' ขนาด 20 และกำหนดค่าเริ่มต้นเป็น 'DIVIDE'
- Code บรรทัดที่ 6: พิมพ์ข้อความ “โปรแกรมเริ่มต้นแล้ว”
- Code บรรทัดที่ 7: คำสั่ง CASE ที่ค้นหาเริ่มต้นขึ้น ส่วนของคำสั่ง ADD และ SUBTRACT และ MULTIPLY จะถูกข้ามไป เนื่องจากเงื่อนไขไม่ตรงกับค่าของ 'arth_operation'
- Code บรรทัดที่ 14: เงื่อนไข WHEN “arth_operation = 'DIVIDE'” เป็นจริงและส่งคืนค่า TRUE
- Code บรรทัดที่ 15: บล็อกการทำงานของคำสั่ง WHEN จะถูกดำเนินการ และข้อความ 'Diction of the numbers are: 11' จะถูกพิมพ์ออกมา
- Code บรรทัดที่ 17: แสดงถึงจุดสิ้นสุดของคำสั่ง CASE
- Code บรรทัดที่ 18: พิมพ์ข้อความ “โปรแกรมเสร็จสมบูรณ์”
Code เอาท์พุต
Program started. Division of the numbers are: 11 Program completed.
การเปรียบเทียบกรณีศึกษาและกรณีที่ค้นหา
ทั้งสองแบบเลือกสาขาเดียว แต่แตกต่างกันในวิธีการเลือกสาขา ดังสรุปไว้ด้านล่าง
| ประเภท | Descriptไอออน | การใช้ |
|---|---|---|
| กรณี | คล้ายกับ ถ้า-แล้ว-ELSIF คำสั่ง 'ตัวเลือก' ถูกใช้เพื่อเลือกทางเลือกอื่นแทนการใช้ค่าบูลีน | ใช้สำหรับเลือกจากตัวเลือกหลายๆ ตัวเลือกโดยใช้ตัวเลือก (selector) |
| กรณีที่ถูกค้นหา | คำสั่ง CASE ที่ไม่มีตัวเลือก (selector) จริงๆ แต่จะมีเงื่อนไข (ซึ่งประเมินค่าได้เป็น TRUE หรือ FALSE) ที่ใช้เลือกทางเลือกอื่นแทน | เคยใช้เลือกจากตัวเลือกมากกว่าสองตัวเลือก โดยส่วนใหญ่จะมีเงื่อนไขช่วงราคา |
