Oracle PL/SQL 编程入门:第五章 条件控制:CASE 语句的使用

欢迎来到 Oracle PL/SQL 编程入门 的第五章!在这一章中,我们将深入探讨 PL/SQL 中的另一种条件控制结构——CASE 语句。通过学习 CASE 语句和 Searched CASE 语句,你将能够编写更加灵活和高效的程序逻辑。此外,我们还将介绍 NULLIFCOALESCE 函数,帮助你更好地处理 NULL 值。准备好迎接新的挑战了吗?让我们开始吧!


第一节:条件控制:CASE 语句

CASE 语句是 PL/SQL 中用于多分支条件判断的一种结构,它可以根据不同的条件执行不同的代码块。相比嵌套的 IF-ELSIF 结构,CASE 语句通常更加简洁和易读,CASE语句的执行流程如下图所示:

Oracle PL/SQL 编程入门:第五章 条件控制:CASE 语句的使用_第1张图片

1.1 使用 CASE 语句

CASE 语句有两种形式:简单 CASE 语句和 Searched CASE 语句。首先我们来看看简单 CASE 语句的用法。

示例:
DECLARE
  v_grade CHAR(1) := 'A';
BEGIN
  CASE v_grade
    WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('优秀');
    WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('良好');
    WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('合格');
    ELSE DBMS_OUTPUT.PUT_LINE('不合格');
  END CASE;
END;
/
输出结果:
优秀
小贴士:CASE 语句让选择更优雅

CASE 语句就像是一个自动售货机,根据你投入的“硬币”(条件)吐出相应的“商品”(结果)。它不仅使代码更加简洁,还能让你的逻辑更加清晰。


第二节:使用 Searched CASE 语句

Searched CASE 语句允许你在每个 WHEN 子句中使用布尔表达式,这使得它可以处理更复杂的条件判断。

示例:
DECLARE
  v_salary NUMBER := 5000;
BEGIN
  CASE 
    WHEN v_salary > 6000 THEN DBMS_OUTPUT.PUT_LINE('薪资高于6000');
    WHEN v_salary BETWEEN 4000 AND 6000 THEN DBMS_OUTPUT.PUT_LINE('薪资在4000到6000之间');
    ELSE DBMS_OUTPUT.PUT_LINE('薪资低于4000');
  END CASE;
END;
/
输出结果:
薪资在4000到6000之间
小贴士:Searched CASE 更加灵活

Searched CASE 语句就像是一个多选项的投票箱,你可以根据不同的条件放入不同的选票。它的灵活性让它成为处理复杂条件判断的理想选择。


第三节:CASE语句和Searched CASE语句的不同点

简单 CASE 语句和 Searched CASE 语句的主要区别在于条件的形式:

  • 简单 CASE 语句:比较的是变量与常量值。
  • Searched CASE 语句:每个 WHEN 子句是一个布尔表达式。
示例对比:
-- 简单 CASE 语句
DECLARE
  v_grade CHAR(1) := 'A';
BEGIN
  CASE v_grade
    WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('优秀');
    WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('良好');
    WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('合格');
    ELSE DBMS_OUTPUT.PUT_LINE('不合格');
  END CASE;
END;
/

-- Searched CASE 语句
DECLARE
  v_salary NUMBER := 5000;
BEGIN
  CASE 
    WHEN v_salary > 6000 THEN DBMS_OUTPUT.PUT_LINE('薪资高于6000');
    WHEN v_salary BETWEEN 4000 AND 6000 THEN DBMS_OUTPUT.PUT_LINE('薪资在4000到6000之间');
    ELSE DBMS_OUTPUT.PUT_LINE('薪资低于4000');
  END CASE;
END;
/
小贴士:选择合适的 CASE 形式

选择合适的形式就像挑选适合的工具,简单 CASE 适用于直接比较变量和常量的情况,而 Searched CASE 则适用于更复杂的条件判断。合理选择可以让你的代码更加简洁和高效。


第四节:CASE表达式

CASE 表达式是一种可以在 SQL 查询中使用的条件表达式,类似于 CASE 语句,但它返回一个值而不是执行一系列语句。

示例:
DECLARE
  v_grade CHAR(1) := 'B';
  v_result VARCHAR2(10);
BEGIN
  -- 使用 CASE 表达式
  v_result := CASE v_grade
    WHEN 'A' THEN '优秀'
    WHEN 'B' THEN '良好'
    WHEN 'C' THEN '合格'
    ELSE '不合格'
  END;

  DBMS_OUTPUT.PUT_LINE('评级: ' || v_result);
END;
/
输出结果:
评级: 良好
小贴士:CASE 表达式让查询更智能

CASE 表达式就像是 SQL 查询中的智能助手,它可以根据不同的条件动态地生成结果。合理使用 CASE 表达式可以让你的查询更加灵活和强大。


第五节:NULLIF 和 COALESCE 函数

在处理数据库时,经常会遇到 NULL 值的问题。PL/SQL 提供了两个有用的函数来处理这些情况:NULLIFCOALESCE

5.1 NULLIF 函数说明

NULLIF 函数用于比较两个表达式,如果它们相等,则返回 NULL;否则返回第一个表达式的值。

示例:
DECLARE
  v_value1 NUMBER := 100;
  v_value2 NUMBER := 100;
  v_result NUMBER;
BEGIN
  -- 使用 NULLIF 函数
  v_result := NULLIF(v_value1, v_value2);

  IF v_result IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('两个值相等,返回 NULL');
  ELSE
    DBMS_OUTPUT.PUT_LINE('两个值不相等,返回 ' || v_result);
  END IF;
END;
/
输出结果:
两个值相等,返回 NULL
小贴士:NULLIF 让比较更智能

NULLIF 函数就像是一个聪明的比较器,当两个值相等时,它会返回 NULL,从而避免不必要的重复处理。合理使用 NULLIF 可以简化你的代码逻辑。


5.2 使用 NULLIF 函数

下面是一个实际应用的例子,假设我们要从数据库中获取员工的绩效评分,并将其与目标评分进行比较。

示例:
DECLARE
  v_actual_score NUMBER := 85;
  v_target_score NUMBER := 85;
  v_result NUMBER;
BEGIN
  -- 使用 NULLIF 函数
  v_result := NULLIF(v_actual_score, v_target_score);

  IF v_result IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('实际评分等于目标评分,返回 NULL');
  ELSE
    DBMS_OUTPUT.PUT_LINE('实际评分不等于目标评分,返回 ' || v_result);
  END IF;
END;
/
输出结果:
实际评分等于目标评分,返回 NULL
5.3 COALESCE 函数说明

COALESCE 函数用于返回其参数中第一个非 NULL 的值。如果有多个参数,它会依次检查每个参数,直到找到第一个非 NULL 的值为止。

示例:
DECLARE
  v_value1 NUMBER := NULL;
  v_value2 NUMBER := 100;
  v_value3 NUMBER := 200;
  v_result NUMBER;
BEGIN
  -- 使用 COALESCE 函数
  v_result := COALESCE(v_value1, v_value2, v_value3);

  DBMS_OUTPUT.PUT_LINE('第一个非 NULL 的值是: ' || v_result);
END;
/
输出结果:
第一个非 NULL 的值是: 100
小贴士:COALESCE 让处理 NULL 更轻松

COALESCE 函数就像是一个过滤器,它会帮你找出第一个非 NULL 的值。合理使用 COALESCE 可以让你的代码更加健壮,减少因 NULL 值导致的错误。


5.4 使用 COALESCE 函数

下面是一个实际应用的例子,假设我们要从数据库中获取员工的多个联系方式,并返回第一个有效的联系方式。

示例:
DECLARE
  v_phone1 VARCHAR2(15) := NULL;
  v_phone2 VARCHAR2(15) := '123-456-7890';
  v_phone3 VARCHAR2(15) := '987-654-3210';
  v_result VARCHAR2(15);
BEGIN
  -- 使用 COALESCE 函数
  v_result := COALESCE(v_phone1, v_phone2, v_phone3);

  DBMS_OUTPUT.PUT_LINE('第一个有效的电话号码是: ' || v_result);
END;
/
输出结果:
第一个有效的电话号码是: 123-456-7890

第六节:注意事项

在编写 PL/SQL 代码时,有一些常见问题需要注意,以避免潜在的错误和性能问题。

6.1 避免过多的嵌套

虽然 CASE 语句比嵌套的 IF-ELSIF 结构更简洁,但仍然要注意不要过度嵌套子句。尽量保持代码简洁明了。

6.2 检查条件表达式的准确性

确保条件表达式准确无误,尤其是在使用 Searched CASE 语句时,仔细检查每个条件是否符合预期。

6.3 处理 NULL 值

在处理 NULL 值时,合理使用 NULLIFCOALESCE 函数,可以有效避免因 NULL 值导致的错误。


第七节:代码挑战

现在是时候来挑战一下自己了!我们将通过几个简单的练习来巩固所学的知识。

挑战一:员工绩效评估

编写一个 PL/SQL 块,根据员工的绩效评分来决定其评级。

示例代码:
DECLARE
  v_performance_score NUMBER := &performance_score; -- 输入绩效评分
  v_rating VARCHAR2(10);
BEGIN
  -- 使用 CASE 表达式
  v_rating := CASE
    WHEN v_performance_score >= 90 THEN '优秀'
    WHEN v_performance_score >= 70 THEN '良好'
    WHEN v_performance_score >= 50 THEN '合格'
    ELSE '不合格'
  END;

  DBMS_OUTPUT.PUT_LINE('评级: ' || v_rating);
END;
/
执行说明:
  1. 在 SQL*Plus 或 SQL Developer 中运行上述代码块。
  2. 提示输入绩效评分,例如 85
  3. 输出结果应为 评级: 良好
挑战二:员工联系方式

编写一个 PL/SQL 块,根据员工的多个联系方式,返回第一个有效的联系方式。

示例代码:
DECLARE
  v_phone1 VARCHAR2(15) := NULL; -- 输入第一个电话号码
  v_phone2 VARCHAR2(15) := '&phone2'; -- 输入第二个电话号码
  v_phone3 VARCHAR2(15) := '&phone3'; -- 输入第三个电话号码
  v_result VARCHAR2(15);
BEGIN
  -- 使用 COALESCE 函数
  v_result := COALESCE(v_phone1, v_phone2, v_phone3);

  DBMS_OUTPUT.PUT_LINE('第一个有效的电话号码是: ' || v_result);
END;
/
执行说明:
  1. 在 SQL*Plus 或 SQL Developer 中运行上述代码块。
  2. 提示输入电话号码,例如 123-456-7890987-654-3210
  3. 输出结果应为 第一个有效的电话号码是: 123-456-7890
小贴士:动手实践是最好的老师

理论知识固然重要,但真正的技能提升来自于不断的实践。通过这些挑战,你可以加深对 PL/SQL 的理解,并发现自己可能忽略的小细节。勇敢地面对每一个挑战,你会发现编程其实并没有那么难!


第八节:本章总结

在这一章中,我们深入探讨了 PL/SQL 中的条件控制结构——CASE 语句以及 NULLIFCOALESCE 函数。以下是本章的主要内容总结:

总结要点:
  1. CASE 语句:掌握简单 CASE 语句和 Searched CASE 语句的使用方法。
  2. CASE 表达式:了解如何在 SQL 查询中使用 CASE 表达式。
  3. NULLIF 函数:熟悉 NULLIF 函数的使用方法,用于比较两个值并返回 NULL。
  4. COALESCE 函数:了解 COALESCE 函数的使用方法,用于返回第一个非 NULL 的值。
  5. 注意事项:注意避免过多的嵌套和确保条件表达式的准确性。

恭喜你完成了第五章的学习!通过这节课,你已经掌握了 PL/SQL 中的条件控制结构和处理 NULL 值的方法,并为后续更高级的内容打下了坚实的基础。未来的学习中,我们将继续探索 PL/SQL 的更多功能,如循环结构、存储过程等。希望你能继续保持对 PL/SQL 的兴趣,勇敢探索,成为一名熟练的 PL/SQL 用户!

你可能感兴趣的:(Oracle,PL/SQL,编程入门,oracle,sql,数据库,CASE,CASE语句,条件语句,NULLIF)