Oracle คำสั่ง PL/SQL IF THEN ELSE: ELSIF, NESTED-IF

คำชี้แจงการตัดสินใจคืออะไร?

แถลงการณ์การตัดสินใจคือผู้ที่จะตัดสินใจควบคุมการไหลของ SQL งบตามเงื่อนไข ช่วยให้โปรแกรมเมอร์ควบคุมได้ดีขึ้นในการป้องกันโค้ดเฉพาะจากการรัน (แผนภาพที่ 1) หรือเลือกโค้ดที่ต้องการตามเงื่อนไข (แผนภาพที่ 2) ด้านล่างนี้คือภาพประกอบของ “คำชี้แจงการตัดสินใจ”

แผนภาพคำสั่งการตัดสินใจ
แผนภาพคำสั่งการตัดสินใจ

ประเภทของคำชี้แจงการตัดสินใจ:

Oracle ให้คำชี้แจงการตัดสินใจประเภทต่อไปนี้

  • ถ้า - แล้ว
  • ถ้า-แล้ว-อย่างอื่น
  • ถ้า-แล้ว-ELSIF
  • ซ้อน-IF
  • กรณี
  • กรณีที่ถูกค้นหา

คำสั่ง IF-THEN

คำสั่ง IF-THEN ส่วนใหญ่จะใช้เพื่อรันโค้ดบางส่วนเมื่อตรงตามเงื่อนไขเท่านั้น

สภาพควรจะให้ผล บูลีน (จริง/เท็จ) เป็นคำสั่งเงื่อนไขพื้นฐานที่จะอนุญาตให้ ORACLE ดำเนินการ/ข้ามโค้ดบางส่วนตามเงื่อนไขที่กำหนดไว้ล่วงหน้า

ไวยากรณ์สำหรับคำสั่ง IF THEN:

IF <condition: returns Boolean>
THEN
 -executed only if the condition returns TRUE 
 <action_block>
END if;
  • ในรูปแบบข้างต้น คำหลัก 'IF' จะตามมาด้วยเงื่อนไขที่ประเมินเป็น 'TRUE'/'FALSE'
  • การควบคุมจะดำเนินการ เฉพาะในกรณีที่เงื่อนไขกลับมา -
  • ในกรณีที่มีการประเมินสภาพถึง จากนั้น SQL จะข้ามไฟล์ และจะเริ่มรันโค้ดถัดจากบล็อก 'END IF'

หมายเหตุ เมื่อใดก็ตามที่ประเมินเงื่อนไขเป็น 'NULL' แล้ว SQL จะถือว่า 'NULL' เป็น 'FALSE'

1 ตัวอย่าง:ในตัวอย่างนี้ เราจะพิมพ์ข้อความเมื่อตัวเลขมากกว่า 100 โดยเราจะดำเนินการโค้ดต่อไปนี้

หากต้องการพิมพ์ข้อความเมื่อตัวเลขมีค่ามากกว่า 100 เราต้องรันโค้ดต่อไปนี้

DECLARE 
a NUMBER :=10;
BEGIN
dbms_output.put_line(‘Program started.' );
IF( a > 100 ) THEN
dbms_output.put_line('a is greater than 100'); 
END IF;
dbms_output.put_line(‘Program completed.');
END;
/

คำอธิบายรหัส:

  • รหัสบรรทัด 2: ประกาศตัวแปร 'a' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '10'
  • บรรทัดรหัส 4: การพิมพ์คำสั่ง "เริ่มต้นโปรแกรม"
  • รหัสบรรทัด 5: การตรวจสอบเงื่อนไขว่าตัวแปร 'a' มากกว่า '100' หรือไม่
  • บรรทัดรหัส 6: หาก 'a' มากกว่า '100' ระบบจะพิมพ์ “a มากกว่า 100” หาก 'a' น้อยกว่าหรือเท่ากับ 100 แสดงว่าเงื่อนไขล้มเหลว ดังนั้นคำสั่งการพิมพ์ด้านบนจึงถูกละเว้น
  • บรรทัดโค้ด 8: การพิมพ์ข้อความ "Program complete"

รหัสเอาท์พุท:

Program started.
Program completed.

2 ตัวอย่าง: ในตัวอย่างนี้ เราจะพิมพ์ข้อความหากมีตัวอักษรที่ระบุอยู่ในสระภาษาอังกฤษ (A, E, I, O, U)

หากต้องการพิมพ์ข้อความเมื่ออักขระที่กำหนดเป็นสระ ให้รันโค้ดดังต่อไปนี้

DECLARE 
a CHAR(1) :=’u’;
BEGIN
IF UPPER(a) in ('A’,'E','I','0','U' ) THEN 
dbms_output.put_line(‘The character is in English Vowels');
END IF;
END;
/

คำอธิบายรหัส:

  • รหัสบรรทัด 2: ประกาศตัวแปร 'a' เป็น 'CHAR' ของประเภทข้อมูลขนาด '1' และเริ่มต้นด้วยค่า 'u'
  • รหัสบรรทัด 4: การตรวจสอบเงื่อนไขว่ามีตัวแปร 'a' อยู่ในรายการหรือไม่ ('A', 'E', 'I', 'O', 'U')
  • ค่าของ 'a' ถูกแปลงเป็นตัวพิมพ์ใหญ่ก่อนที่จะเปรียบเทียบเพื่อให้การเปรียบเทียบไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่
  • รหัสบรรทัด 5: หากมี 'a' อยู่ในรายการ ข้อความ “The character is in English Vowels” จะถูกพิมพ์ออกมา หากเงื่อนไขล้มเหลว โปรแกรมนี้จะไม่ให้ผลลัพธ์ใดๆ เนื่องจากนอกบล็อก IF-THEN เรายังไม่ได้ออกคำสั่งการพิมพ์ใดๆ

รหัสเอาท์พุท:

The character is in English Vowels

คำสั่ง IF-THEN-ELSE

  • คำสั่ง IF-THEN-ELSE ส่วนใหญ่จะใช้ในการเลือกระหว่างสองทางเลือกตามเงื่อนไข
  • ด้านล่างนี้คือการแสดงไวยากรณ์ของคำสั่ง IF-THEN-ELSE

ไวยากรณ์สำหรับคำสั่ง IF-THEN-ELSE:

IF <condition: returns Boolean>
THEN
	-executed only if the condition returns TRUE
	<action_blockl>
ELSE
	-execute if the condition failed (returns FALSE)
	<action_block2>
END if;
  • ในรูปแบบข้างต้น คำหลัก 'IF' จะตามมาด้วยเงื่อนไขที่ประเมินเป็น 'TRUE'/'FALSE'
  • การควบคุมจะดำเนินการ เฉพาะในกรณีที่เงื่อนไขกลับมา -
  • ในกรณีที่มีการประเมินสภาพถึง จากนั้น SQL จะดำเนินการ -
  • ไม่ว่าในกรณีใด จะมีการดำเนินการหนึ่งในสองบล็อกการดำเนินการ

หมายเหตุ เมื่อใดก็ตามที่เงื่อนไขประเมินเป็น 'NULL' ดังนั้น SQL จะถือว่า 'NULL' เป็น 'FALSE'

1 ตัวอย่าง: ในตัวอย่างนี้ เราจะพิมพ์ข้อความว่าตัวเลขที่กำหนดเป็นเลขคี่หรือเลขคู่

DECLARE 
a NUMBER:=11;
BEGIN
dbms_output.put_line (‘Program started');
IF( mod(a,2)=0) THEN 
dbms_output.put_line('a is even number' ); 
ELSE
dbms_output.put_line('a is odd number1); 
END IF;
dbms_output.put_line (‘Program completed.’);
END;
/

คำอธิบายรหัส:

  • รหัสบรรทัด 2: ประกาศตัวแปร 'a' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '11'
  • บรรทัดรหัส 4: การพิมพ์คำสั่ง "เริ่มต้นโปรแกรม"
  • บรรทัดโค้ด 5: การตรวจสอบเงื่อนไขว่าโมดูลัสของตัวแปร 'a' คูณ '2' เป็น 0 หรือไม่
  • รหัสบรรทัด 6: หาก '0' ระบบจะพิมพ์ "a เป็นเลขคู่"
  • รหัสบรรทัด 7: หากค่าโมดูลัสไม่เท่ากับ '0' เงื่อนไขก็จะส่งคืน จึงจะพิมพ์ข้อความ “a เป็นเลขคี่”
  • รหัสบรรทัดที่ 10: การพิมพ์คำสั่ง “โปรแกรมเสร็จสมบูรณ์”

รหัสเอาท์พุท:

Program started.
a is odd number
Program completed.

คำสั่ง IF-THEN-ELSIF

  • คำสั่ง IF-THEN-ELSIF ส่วนใหญ่จะใช้ในกรณีที่ควรเลือกทางเลือกหนึ่งจากชุดทางเลือก โดยที่แต่ละทางเลือกมีเงื่อนไขของตัวเองที่จะต้องปฏิบัติตาม
  • เงื่อนไขแรกที่ส่งคืน จะถูกดำเนินการ และเงื่อนไขที่เหลือจะถูกข้ามไป
  • คำสั่ง IF-THEN-ELSIF อาจมีบล็อก 'ELSE' อยู่ในนั้น บล็อก 'ELSE' นี้จะถูกดำเนินการหากไม่มีเงื่อนไขใดที่ตรงตามเงื่อนไข

หมายเหตุ: บล็อก ELSE เป็นทางเลือกในคำสั่งแบบมีเงื่อนไขนี้ หากไม่มีบล็อก ELSE และไม่มีเงื่อนไขใดที่ตรงตามความต้องการ คอนโทรลเลอร์จะข้ามบล็อกการดำเนินการทั้งหมดและเริ่มดำเนินการโค้ดส่วนที่เหลือ

ไวยากรณ์สำหรับคำสั่ง IF-THEN-ELSIF:

IF <conditionl: returns Boolean>
THEN
-executed only if the condition returns TRUE <
action_blockl>
ELSIF <condition2 returns Boolean> <
action_block2>
ELSIF <condition3:returns Boolean> <
action_block3>
ELSE —optional 
<action_block_else>
END if;
  • ในรูปแบบข้างต้น ตัวควบคุมจะดำเนินการ เฉพาะในกรณีที่เงื่อนไข 1 ส่งคืน -
  • หากเงื่อนไข 1 ไม่เป็นไปตามนั้น คอนโทรลเลอร์จะตรวจสอบเงื่อนไข 2
  • ตัวควบคุมจะออกจากคำสั่ง IF ในสองกรณีต่อไปนี้
    • เมื่อผู้ควบคุมพบเงื่อนไขใด ๆ ที่ส่งคืน - ในกรณีนี้ action_block ที่เกี่ยวข้องจะถูกดำเนินการ และตัวควบคุมจะออกจากบล็อกคำสั่ง IF นี้ และจะเริ่มดำเนินการโค้ดที่เหลือ
    • เมื่อไม่ตรงตามเงื่อนไขใดๆ ตัวควบคุมจะดำเนินการบล็อก ELSE หากมีอยู่ จากนั้นจะออกจากคำสั่ง IF

หมายเหตุ เมื่อใดก็ตามที่เงื่อนไขประเมินเป็น 'NULL' ดังนั้น SQL จะถือว่า 'NULL' เป็น 'FALSE'

1 ตัวอย่าง: ไม่มีบล็อก ELSE

ในตัวอย่างนี้ เราจะพิมพ์เกรดตามเครื่องหมายที่กำหนดโดยไม่มีเงื่อนไขอื่น (เครื่องหมาย >= 70 เกรด A, เครื่องหมาย >=40 และเครื่องหมาย <70 เกรด B, เครื่องหมาย >=35 และเครื่องหมาย <40 เกรด C)

DECLARE
mark NUMBER :=55;
BEGIN
dbms_output.put_line(‘Program started.’ );
IF( mark >= 70) THEN 
dbms_output.put_line(‘Grade A’);
ELSIF(mark >= 40 AND mark < 70) THEN
dbms_output.put_line(‘Grade B'); 
ELSIF(mark >=35 AND mark < 40) THEN
dbms_output.put_line(‘Grade C’);
END IF;
dbms_output.put_line(‘Program completed.’); 
END;
/

คำอธิบายรหัส:

  • รหัสบรรทัด 2: ประกาศตัวแปร 'ทำเครื่องหมาย' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '55'
  • บรรทัดรหัส 4: การพิมพ์คำสั่ง "เริ่มต้นโปรแกรม"
  • บรรทัดรหัส 5: การตรวจสอบเงื่อนไข 1 ว่า 'เครื่องหมาย' มากกว่าหรือเท่ากับ 70
  • รหัสบรรทัด 7: เนื่องจากเงื่อนไข 1 ล้มเหลว ดังนั้นเงื่อนไข 2 '70>เครื่องหมาย>=40′ จะถูกตรวจสอบ
  • รหัสบรรทัด 8: เงื่อนไข 2 ส่งคืน ดังนั้นข้อความ 'เกรด B' จะถูกพิมพ์ออกมา
  • รหัสบรรทัดที่ 12: การพิมพ์คำสั่ง "โปรแกรมเสร็จสมบูรณ์"
  • ในกรณีนี้ เงื่อนไข 3 'เครื่องหมาย < 35' จะถูกข้ามไป เนื่องจากตัวควบคุมพบเงื่อนไขหนึ่งที่ส่งคืน ก่อนเงื่อนไขที่ 3

รหัสเอาท์พุท:

Program started.
Grade B
Program completed.

2 ตัวอย่าง: มีบล็อก ELSE

ในตัวอย่างนี้ เราจะพิมพ์เกรดตามเครื่องหมายที่กำหนดโดยมีเงื่อนไข else (เครื่องหมาย >= 70 เกรด A, เครื่องหมาย >=40 และเครื่องหมาย <70 เกรด B, เครื่องหมาย >=35 และเครื่องหมาย <40 เกรด C, อย่างอื่น 'ไม่มีเกรด')

DECLARE
mark NUMBER :=25;
BEGIN
dbms_output.put_line(‘Program started.’ );
IF( mark >= 70) THEN 
dbms_output.put_line(‘Grade A’); 
ELSIF(mark >= 40 AND mark < 70) THEN 
dbms_output.put_line(‘Grade B'); 
ELSIF(mark >=35 AND mark < 40) THEN 
dbms_output.put_line(‘Grade C);
ELSE
dbms_output.put_line(‘No Grade’);
END IF;
dbms_output.put_line(‘Program completed.' ); 
END;
/

คำอธิบายรหัส:

  • รหัสบรรทัด 2: ประกาศตัวแปร 'ทำเครื่องหมาย' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '25'
  • บรรทัดรหัส 4: การพิมพ์คำสั่ง "เริ่มต้นโปรแกรม"
  • รหัสบรรทัด 5: ตรวจสอบเงื่อนไข 1 ว่า 'เครื่องหมาย' มากกว่าหรือเท่ากับ 70
  • รหัสบรรทัด 7: เนื่องจากเงื่อนไข 1 ล้มเหลว ดังนั้นเงื่อนไข 2 '70>เครื่องหมาย>=40′ จะถูกตรวจสอบ
  • รหัสบรรทัด 8: เนื่องจากเงื่อนไข 2 ล้มเหลว ดังนั้นเงื่อนไข 3 '40>เครื่องหมาย>=35′ จะถูกตรวจสอบ
  • รหัสบรรทัด 11: เนื่องจากเงื่อนไขทั้งหมดล้มเหลว การควบคุมจะตรวจสอบการมีอยู่ของบล็อก ELSE และจะพิมพ์ข้อความ 'ไม่มีเกรด' จากบล็อก ELSE
  • รหัสบรรทัดที่ 14: การพิมพ์คำสั่ง "โปรแกรมเสร็จสมบูรณ์"

รหัสเอาท์พุท:

Program started.
No Grade 
Program completed.

คำสั่ง NESTED-IF

  • โดยทั่วไปแล้ว คำสั่ง NESTED-IF อนุญาตให้โปรแกรมเมอร์วางเงื่อนไข 'IF' อย่างน้อยหนึ่งเงื่อนไขภายในเงื่อนไข 'IF' อื่น นอกเหนือจากข้อความปกติ
  • เงื่อนไข 'IF' แต่ละเงื่อนไขควรมีคำสั่ง 'END IF' แยกต่างหากซึ่งถือเป็นการสิ้นสุดขอบเขตของเงื่อนไขนั้น -
  • คำสั่ง 'IF' จะพิจารณาคำสั่ง 'END IF' ที่ใกล้ที่สุดเป็นจุดสิ้นสุดสำหรับเงื่อนไขนั้นโดยเฉพาะ
  • การแสดงรูปภาพสำหรับ NESTED-IF แสดงอยู่ด้านล่างแผนภาพ

คำสั่ง NESTED-IF

คำสั่ง NESTED-IF

IF <conditionl: returns Boolean>
THEN
	—executed only if the condition returns TRUE
	<action block1 starts>
	IF <condition2: returns Boolean>
	THEN
	<action_block2>
	END IF; —END IF corresponds to condition2
<action_blockl ends>
END IF; —END IF corresponds to condition1

คำอธิบายไวยากรณ์:

  • ในรูปแบบข้างต้น IF ภายนอกจะมีคำสั่ง IF มากกว่าหนึ่งคำสั่งในบล็อกการดำเนินการ
  • เงื่อนไข 1 ส่งคืน จากนั้นการควบคุมจะดำเนินการ และตรวจสอบสภาพ1.
  • หากเงื่อนไข 2 ส่งคืนเช่นกัน , แล้ว จะถูกดำเนินการด้วย
  • ในกรณีที่เงื่อนไข 2 ประเมินเป็น จากนั้น SQL จะข้ามไฟล์ -

เราจะมาดูตัวอย่างของ Nested If –

ตัวอย่างของคำสั่ง Nested- If: Greatest of three number

ในตัวอย่างนี้ เราจะพิมพ์ตัวเลขที่มากที่สุดจากสามตัวโดยใช้คำสั่ง Nested-If ตัวเลขจะถูกกำหนดไว้ในส่วนการประกาศ ดังที่คุณเห็นในโค้ดด้านล่าง นั่นคือ Number= 10,15, 20 และ XNUMX และตัวเลขสูงสุดจะถูกดึงออกมาโดยใช้คำสั่ง nested-if

DECLARE 
a NUMBER :=10; 
b NUMBER :=15; 
c NUMBER :=20;
BEGIN
dbms_output.put_line(‘Program started.' );
IF( a > b)THEN
/*Nested-if l */
	dbms_output.put_line(’Checking Nested-IF 1'); 
	IF( a > c ) THEN
	dbms_output.put_line(‘A is greatest’); 
	ELSE
	dbms_output.put_line(‘C is greatest’); 
	END IF;
ELSE
/*Nested-if2 */
	dbms_output.put_line('Checking Nested-IF 2' ); 
	IF( b > c ) THEN
	dbms_output.put_line(’B is greatest' ); 
	ELSE
	dbms_output.put_line(’C is greatest' ); 
	END IF;
END IF;
dbms_output.put_line(‘Program completed.’ );
END;
/

คำอธิบายรหัส:

  • รหัสบรรทัด 2: ประกาศตัวแปร 'a' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '10'
  • รหัสบรรทัด 3: ประกาศตัวแปร 'b' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '15'
  • บรรทัดโค้ด 4: ประกาศตัวแปร 'c' เป็นประเภทข้อมูล 'NUMBER' และเริ่มต้นด้วยค่า '20'
  • รหัสบรรทัดที่ 6: การพิมพ์ข้อความ “เริ่มต้นโปรแกรม” (บรรทัดที่ 6)
  • รหัสบรรทัด 7: ตรวจสอบเงื่อนไข 1 ว่า 'a' มากกว่า 'b' (บรรทัด 7)
  • บรรทัดโค้ด 10: หาก 'a' มากกว่า 'b ดังนั้นเงื่อนไขใน 'nested-if 1' จะตรวจสอบว่า 'a' มากกว่า 'c' (บรรทัด 10)
  • รหัสบรรทัด 13: หากยังคงเป็น 'a' มากกว่า ข้อความ 'A ยิ่งใหญ่ที่สุด' จะถูกพิมพ์ (บรรทัด 11) มิฉะนั้นหากเงื่อนไข 2 ล้มเหลว ระบบจะพิมพ์ 'C มากที่สุด' (บรรทัดที่ 13)
  • รหัสบรรทัด 18: ในกรณีที่เงื่อนไข 1 ส่งกลับค่าเท็จ เงื่อนไขใน 'nested-if 2' จะตรวจสอบว่า 'b' มากกว่า 'c' (บรรทัด 18)
  • บรรทัดโค้ด 21: หาก 'b' มากกว่า 'c' ข้อความ 'B ยิ่งใหญ่ที่สุด' จะถูกพิมพ์ (บรรทัด 19) มิฉะนั้นหากเงื่อนไข 2 ล้มเหลว 'C ยิ่งใหญ่ที่สุด' จะถูกพิมพ์ (บรรทัด 21)
  • รหัสบรรทัด 24: การพิมพ์ข้อความ “โปรแกรมเสร็จสมบูรณ์” (บรรทัด 24)

ผลลัพธ์ของรหัส:

Program started.
Checking Nested-IF 2
C is greatest
Program completed.

สรุป

ในบทนี้ เราได้เรียนรู้ข้อความเพื่อการตัดสินใจต่างๆ ตลอดจนไวยากรณ์และตัวอย่าง ตารางด้านล่างนี้ให้ข้อมูลสรุปของข้อความสั่งแบบมีเงื่อนไขต่างๆ ที่เราได้พูดคุยกัน

ประเภท DESCRIPTION การใช้
ถ้า - แล้ว ตรวจสอบเงื่อนไขบูลีน หากโค้ด TRUE ในบล็อก 'THEN' จะถูกดำเนินการ หากต้องการข้าม/รันโค้ดเฉพาะตามเงื่อนไข
ถ้า-แล้ว-อย่างอื่น ตรวจสอบเงื่อนไขบูลีน หากโค้ด TRUE ในบล็อก 'THEN' จะถูกดำเนินการ หากโค้ดเท็จในบล็อก 'ELSE' ถูกดำเนินการ เหมาะสมที่สุดในสภาพ 'นี้หรือนั่น'
ถ้า-แล้ว-ELSIF ตรวจสอบเงื่อนไขบูลีนตามลำดับ บล็อกแรกในลำดับที่ส่งคืนเงื่อนไข TRUE จะถูกดำเนินการ หากไม่มีเงื่อนไขใดในลำดับที่เป็น TRUE โค้ดในบล็อก 'ELSE' จะถูกดำเนินการ เคยเลือกมากกว่าสองทางเลือกเป็นส่วนใหญ่
ซ้อน-IF อนุญาตหนึ่งหรือหลายคำสั่ง IF-THEN หรือ IF-THEN-ELSIF ภายในคำสั่ง IF-THEN หรือ IF-THEN-ELSIF อื่น ส่วนใหญ่ใช้ในสถานการณ์ที่มีสภาพซ้อนกัน