ORACEL条件判断语句

本文通过多个案例展示了PL/SQL中的条件判断语句(IF-ELSE、CASE-WHEN)及DECODE函数的应用,包括学生信息筛选、成绩等级评定等场景。

一、IF-ELSE判断

1、if...then...end if;

案例1:输出年龄大于19岁的学生信息
declare
type cur is ref cursor;--声明ref游标类型
type rec is record(  --声明记录数据类型
  r1 number,
  r2 varchar2(20),
  r3 float,
  r4 varchar2(20)
);
cur_01 cur; --声明ref游标变量
rec_01 rec; --声明记录类型变量

begin
open cur_01 for --打开游标
  select id,name,age,major from student;
loop
  fetch cur_01 into rec_01; --获取游标所在行数据并存储在rec_01中
  exit when cur_01%notfound; --当游标在最后一行时退出
  if rec_01.r3 > 19 then     --当年龄大于19时输出
      dbms_output.put('学号:'||rec_01.r1||'  ');
      dbms_output.put('姓名:'||rec_01.r2||'  ');
      dbms_output.put('年龄:'||rec_01.r3||'  ');
      dbms_output.put_line('专业:'||rec_01.r4||'  ');
  end if;        
  end loop;
  close cur_01; --关闭游标
end;

2、if...then...else...end if;

案例2:输出及格人数和不及格人数
declare
type cur is ref cursor;--声明ref游标类型
cur_01 cur;--声明ref游标变量
type rec is record(  --声明记录数据类型
 m1 VARCHAR2(32),
 m2 VARCHAR2(32),
 m3 float
);
rec_01 rec; --声明记录类型变量
 r2 float :=0;
 r3 float :=0;

begin
 open cur_01 for select c_name,s_name,score from s_course;
  
 loop
  fetch cur_01 into rec_01; --获取游标所在行数据并存储到记录变量中
  exit when cur_01%notfound;
  
  if rec_01.m3 >= 60 then 
      r2:=r2+1;
  else
      r3 :=r3+1;
  end if;  
 end loop;
 close cur_01;
 
  dbms_output.put_line('及格人数:'||r2);
  dbms_output.put_line('不及格人数:'||r3);
end;

3、if...then...elsif...else...end if;

案例3:输出学生成绩等级(不及格,及格,优秀)
declare
type cur is ref cursor;
cur_01 cur;
type rec is record(
 m1 VARCHAR2(32),
 m2 VARCHAR2(32),
 m3 float
);
rec_01 rec;
r1 varchar2(20); 

begin
 open cur_01 for select c_name,s_name,score from s_course;
  
 loop
  fetch cur_01 into rec_01;
  exit when cur_01%notfound;  
  if rec_01.m3 < 60 then
     r1 := '不及格';
  elsif rec_01.m3 >= 60 and rec_01.m3 < 80 then
     r1 := '及格';
  else                                       
     r1 := '优秀';
  end if;  
  dbms_output.put('课程名称:'||rec_01.m1||'   ');
  dbms_output.put('学生姓名:'||rec_01.m2||'   ');
  dbms_output.put_line('成绩等级:'||r1);
  end loop;
  close cur_01;
end;

二、CASE-WHEN判断

1、case...when...then...else...end case;

案例4:输出学生成绩等级(不及格,及格,优秀)
declare
type cur is ref cursor;--声明ref游标类型
cur_01 cur;--声明ref游标变量
type rec is record(  --声明记录数据类型
 m1 VARCHAR2(32),
 m2 VARCHAR2(32),
 m3 float
);
rec_01 rec; --声明记录类型变量
r1 varchar2(20); --声明变量

begin
 open cur_01 for --打开游标
  select c_name,s_name,score from s_course;
  
 loop
  fetch cur_01 into rec_01; --获取游标所在行数据并存储到记录变量中
  exit when cur_01%notfound;  
  case 
    when rec_01.m3 < 60 then 
     r1 :='不及格';
    when rec_01.m3 >= 60 and rec_01.m3 < 80 then
     r1 :='及格';
    else
     r1 :='优秀';
  end case;
  dbms_output.put('课程名称:'||rec_01.m1);
  dbms_output.put('学生姓名:'||rec_01.m2);
  dbms_output.put_line('成绩等级:'||r1);
  end loop;
  close cur_01;
end;

三、DECODE()函数

1、decode(value,if1...then1...if2...then2...else)

案例5:查询男生女生数量
select sum(decode(sex,'男',1,0)) as 男生,sum(decode(sex,'女',1,0)) as 女生 from student;

<think> 首先,用户的问题是:“我想查找Oracle数据库中条件判断语句的相关信息 请问Oracle数据库条件判断语句”。用户明确提到Oracle数据库的条件判断语句,并且提供了几个引用作为上下文。 我需要参考用户提供的引用: - 引用[1]:解释了Oracle中的if条件判断语句语法,提到Oracle的elsif缺一个E,SQL Server的不同等。 - 引用[2]:展示了having子句和where子句在Oracle中的使用。 - 引用[3]:介绍了Oracle的搜索式CASE语句。 - 引用[4]:是关于Oracle建表语句的例子。 - 引用[5]:描述了Oracle条件判断语句的例子,特别是使用CASE语句翻译值。 用户指令强调: - 所有行内数学表达式用$...$格式(但这里可能用不着)。 - 独立公式用$$...$$(不太相关)。 - LaTeX语法正确(在文本中可能用到)。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾自然地添加引用标识,如[^1]。 回答结构: - 结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 基于提供的引用回答问题。 关键点:用户在问Oracle数据库的条件判断语句。从引用中,核心内容是: - Oracle有IF语句,但主要在PL/SQL中使用。 - SQL级别,Oracle使用CASE表达式进行条件判断。 - 引用[3]直接给出了搜索式CASE的语法:CASE WHEN condition THEN result ... END。 - 引用[5]提供了一个示例:使用CASE翻译sale值。 我的回答应该聚焦在Oracle SQL的条件判断语句上: - 主要使用CASE表达式。 - 在PL/SQL中,有IF-THEN-ELSIF结构(引用[1]提到)。 逐步解答: 1. **介绍Oracle条件判断语句**:在SQL中,Oracle使用CASE表达式;在PL/SQL中,使用IF语句。 2. **详细解释CASE表达式**: - 简单CASE:CASE expression WHEN value THEN result ... - 搜索式CASE:CASE WHEN condition THEN result ... 3. **给出示例**:基于引用[5],提供一个CASE语句的例子。 4. **提及IF语句在PL/SQL中**:引用[1]提到Oracle的IF语句有elsif关键字。 5. **添加引用标识**:在相关部分末尾添加[^n]来引用来源。 最后,生成相关问题: - 根据指令,添加“§§相关问题§§”部分,列出3-4个相关问题。 完整回答结构: - 开头:简要介绍Oracle条件判断语句。 - 主体: - 解释CASE语句的语法和示例。 - 简要提到PL/SQL中的IF语句。 - 结尾:总结或提示。 - 然后:§§相关问题§§ 列出问题。 确保语言中文。 大纲回答: 1. **Oracle SQL中的条件判断**:主要使用CASE表达式。 - 语法:引用[3]的搜索式CASE。 - 示例:基于引用[5],创建一个SQL示例。 2. **PL/SQL中的条件判断**:使用IF-THEN-ELSIF。 - 语法:引用[1]提到。 3. **其他注意事项**:如优先级(AND高于OR,引用[3])。 4. **相关问题生成**。 </think> ### Oracle数据库条件判断语句详解 在Oracle数据库中,条件判断语句主要用于在SQL查询或PL/SQL代码中根据特定条件执行不同的操作。核心语法包括CASE表达式(适用于SQL查询)和IF语句(适用于PL/SQL块)。以下我将基于您提供的引用信息,逐步解释语法、示例和应用注意事项,确保内容真实可靠。 #### 1. **CASE表达式(SQL级别)** CASE表达式是Oracle SQL中最常用的条件判断工具,适用于SELECT、WHERE、HAVING等子句。它有两种形式:简单CASE和搜索式CASE。 - **语法**: - **简单CASE**:直接比较表达式值。 ```sql CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ... ELSE default_result END ``` - **搜索式CASE**:支持复杂条件判断(如多个条件组合)。 ```sql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE default_result END ``` AND优先级高于OR,字符串需用单引号包裹[^3]。 - **示例**: 假设有一个表`output`,包含`monthid`(VARCHAR型)和`sale`(NUMBER型)列。根据`sale`值翻译结果: ```sql SELECT monthid, sale, CASE WHEN sale = 1000 THEN 'D' WHEN sale = 2000 THEN 'C' WHEN sale = 3000 THEN 'B' WHEN sale = 4000 THEN 'A' ELSE 'Other' END AS translation FROM output; ``` 此示例中,当`sale`为1000时输出'D',以此类推;否则输出'Other'[^5]。 - **应用场景**: - 在`SELECT`子句中动态计算字段值。 - 在`HAVING`子句中过滤分组结果(与`WHERE`的区别是`WHERE`直接筛选表字段,而`HAVING`筛选聚合后的字段)[^2]。 #### 2. **IF语句(PL/SQL级别)** IF语句仅在PL/SQL代码块(如存储过程、触发器)中使用,不支持直接在SQL查询中调用。 - **语法**: ```sql IF condition1 THEN statement1; ELSIF condition2 THEN -- 注意:Oracle使用ELSIF(缺一个'E') statement2; ELSE default_statement; END IF; ``` SQL Server的IF语法不同(需用BEGIN...END包裹语句块),而Oracle的ELSIF是关键字[^1]。 - **示例**: 在PL/SQL块中实现条件逻辑: ```sql DECLARE sal NUMBER := 3000; BEGIN IF sal > 4000 THEN DBMS_OUTPUT.PUT_LINE('A级'); ELSIF sal > 3000 THEN DBMS_OUTPUT.PUT_LINE('B级'); ELSE DBMS_OUTPUT.PUT_LINE('其他'); END IF; END; ``` 此代码根据`sal`值输出不同等级。 #### 3. **关键注意事项** - **优先级**:在条件中,AND操作符优先级高于OR,需用括号明确逻辑,例如`(condition1 OR condition2) AND condition3`[^3]。 - **适用场景**: - CASE表达式适合在SELECT查询中处理数据转换。 - IF语句适合在PL/SQL中控制流程(如循环或分支)。 - **性能建议**:对于大数据量查询,优先使用CASE而非嵌套IF,以提高执行效率。 通过上述解释,您可以在SQL中使用CASE实现灵活的判断逻辑,或在PL/SQL中利用IF处理复杂控制流。如果需要更具体的示例或优化技巧,请提供上下文! ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值