คำชี้แจงกรณีใน Oracle PL/SQL พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

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

  • 🔀 วัตถุประสงค์: คำสั่ง CASE จะเลือกบล็อกการกระทำหนึ่งบล็อกจากหลายบล็อก โดยใช้ตัวเลือกแทนการใช้ตรรกะบูลีน
  • 🎯 ตัวเลือก: นิพจน์ CASE จะถูกประเมินเพียงครั้งเดียวและนำไปเปรียบเทียบกับค่า WHEN แต่ละค่า
  • 🔎 กรณีที่ค้นหา: ใส่เงื่อนไขแบบเต็มรูปแบบในแต่ละส่วนของคำสั่ง WHEN และเรียกใช้เงื่อนไขแรกที่เป็นจริง
  • 🧮 ทุกประเภท: ตัวเลือกอาจเป็นตัวแปร ตัวเลข หรือนิพจน์ทางคณิตศาสตร์ก็ได้
  • 🛟 อื่น: บล็อก ELSE ที่เป็นตัวเลือกจะทำงานเมื่อไม่มีการจับคู่ทางเลือกอื่น
  • 🔚 กรณีสิ้นสุด: คำสั่ง END CASE เป็นสิ่งที่จำเป็นในการปิดท้ายคำสั่ง
  • 🗄️ รองรับ SQL: ต่างจาก IF คำสั่ง CASE สามารถใช้ได้โดยตรงภายในคำสั่ง SQL

คำชี้แจงกรณีใน Oracle PL / SQL

คำสั่ง 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) ที่ใช้เลือกทางเลือกอื่นแทน เคยใช้เลือกจากตัวเลือกมากกว่าสองตัวเลือก โดยส่วนใหญ่จะมีเงื่อนไขช่วงราคา

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

คำสั่ง CASE แบบง่ายๆ จะเปรียบเทียบค่าตัวเลือกหนึ่งค่ากับค่า WHEN แต่ละค่า ในขณะที่คำสั่ง CASE แบบค้นหาจะไม่มีตัวเลือกและจะประเมินเงื่อนไขทั้งหมดใน WHEN แต่ละค่า ดังนั้นจึงสามารถจัดการกับช่วงและเงื่อนไขที่ซับซ้อนได้

ใช่แล้ว นิพจน์ CASE สามารถปรากฏในส่วน SELECT, WHERE หรือ ORDER BY ได้ ซึ่งเป็นข้อได้เปรียบที่สำคัญเหนือกว่า IF-THEN-ELSIF ซึ่งเป็นโครงสร้างที่ใช้งานได้เฉพาะภายในบล็อก PL/SQL เท่านั้น

คำสั่ง CASE จะทำให้เกิดข้อยกเว้น CASE_NOT_FOUND หากไม่มีเงื่อนไขใดตรงกันและไม่มีคำสั่ง ELSE อยู่ การเพิ่มคำสั่ง ELSE แม้จะเป็นค่า NULL ที่ว่างเปล่า ก็สามารถหลีกเลี่ยงข้อผิดพลาดขณะรันไทม์นี้ได้

ใช่แล้ว เมื่อเงื่อนไขต่าง ๆ เปรียบเทียบนิพจน์หนึ่งกับค่าคงที่ AI สามารถเขียนโค้ดใหม่ให้เป็นคำสั่ง CASE ที่ดูเรียบร้อยกว่าได้ ตรวจสอบผลลัพธ์อีกครั้ง เนื่องจากคำสั่ง CASE ที่ไม่มี ELSE จะทำงานแตกต่างจากคำสั่ง ELSIF ที่หายไป

คำสั่ง CASE จะเรียกใช้บล็อกการกระทำต่อแต่ละสาขาและจบด้วย END CASE ในขณะที่นิพจน์ CASE จะส่งคืนค่าเดียวและจบด้วย END ดังนั้นจึงสามารถกำหนดให้กับตัวแปรหรือใช้ใน SQL ได้

สรุปโพสต์นี้ด้วย: