Oracle23ai新特性case when子句增加多条件判断

Oracle23ai新特性case when子句增加多条件判断,语句更加灵活易用,更好支持SQL标准。

参考官方文档 CASE Expressions

https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/plsql-language-fundamentals.html#GUID-216F1B33-493F-4CDE-93BB-096BACA8523E

1、本文内容

  • 新特性在Oracle23ai中简单使用
  • 通用所有版本的基础写法

2、Oracle23ai新特性case when子句多条件判断

2.1、测试实例

TESTUSER@FREEPDB1> select EMPLOYEE_ID,FIRST_NAME,SALARY from employees where rownum<=10;

EMPLOYEE_ID FIRST_NAME                                                       SALARY
----------- ------------------------------------------------------------ ----------
        100 Steven                                                            24000
        101 Neena                                                             17000
        102 Lex                                                               17000
        103 Alexander                                                          9000
        104 Bruce                                                              6000
        105 David                                                              4800
        106 Valli                                                              4800
        107 Diana                                                              4200
        108 Nancy                                                             12008
        109 Daniel                                                             9000
-- 第一种使用游标
declare ISFlag varchar2(32);
begin
  for cur_case_when_new  in ( select EMPLOYEE_ID,FIRST_NAME,SALARY from employees where rownum<=10) 
  loop
    ISFlag :=
	case cur_case_when_new.SALARY
		WHEN >13000 THEN 'high'
		WHEN 9000, 12008 THEN 'normal'
		WHEN 4800,4200,6000 THEN 'low'
		ELSE 'executive pay'
	 end;
    dbms_output.put_line('员工编号:'||cur_case_when_new.EMPLOYEE_ID || '姓名:' ||cur_case_when_new.FIRST_NAME || ' 工资级别:' ||ISFlag);
  end loop;  
end;
/
-- Result:
员工编号:100 姓名:Steven 工资级别:high
员工编号:101 姓名:Neena 工资级别:high
员工编号:102 姓名:Lex 工资级别:high
员工编号:103 姓名:Alexander 工资级别:normal
员工编号:104 姓名:Bruce 工资级别:low
员工编号:105 姓名:David 工资级别:low
员工编号:106 姓名:Valli 工资级别:low
员工编号:107 姓名:Diana 工资级别:low
员工编号:108 姓名:Nancy 工资级别:normal
员工编号:109 姓名:Daniel 工资级别:normal

-- 第二种使用with function 子句
with function get_level(P_SALARY in number) return varchar2
is  
  begin
     return 
	 case P_SALARY
		WHEN >13000 THEN 'high'
		WHEN 9000, 12008 THEN 'normal'
		WHEN 4800,4200,6000 THEN 'low'
		ELSE 'executive pay'
	 end;
  end;
 select EMPLOYEE_ID,FIRST_NAME,SALARY,get_level(SALARY) as ISFlag from employees where rownum<=10;
 /
 
EMPLOYEE_ID FIRST_NAME                         SALARY ISFLAG
----------- ------------------------------ ---------- ------------------------------
        100 Steven                              24000 high
        101 Neena                               17000 high
        102 Lex                                 17000 high
        103 Alexander                            9000 normal
        104 Bruce                                6000 low
        105 David                                4800 low
        106 Valli                                4800 low
        107 Diana                                4200 low
        108 Nancy                               12008 normal
        109 Daniel                               9000 normal
-- 以上两种PL/SQL写法都是Oracle23ai新特性支持,之前版本Oracle19c/12c/11g都无法使用

2.2、Oracle23ai/19c/12c/11g同时支持语句

 select EMPLOYEE_ID,FIRST_NAME,SALARY,
        CASE 
	    WHEN SALARY >13000 THEN 'high'
		WHEN SALARY>=9000 and SALARY<=12008 THEN 'normal'
		WHEN SALARY>=4200 and SALARY<=6000 THEN 'low'
		ELSE 'executive pay' end as ISFlag 
 from employees where rownum<=10;

-- Result:
EMPLOYEE_ID FIRST_NAME                         SALARY ISFLAG
----------- ------------------------------ ---------- ------------------------------
        100 Steven                              24000 high
        101 Neena                               17000 high
        102 Lex                                 17000 high
        103 Alexander                            9000 normal
        104 Bruce                                6000 low
        105 David                                4800 low
        106 Valli                                4800 low
        107 Diana                                4200 low
        108 Nancy                               12008 normal
        109 Daniel                               9000 normal

10 rows selected.

2.2、官方示例

DECLARE
    salary NUMBER := 7000;
    salary_level VARCHAR2(20);
BEGIN
    salary_level :=
	CASE salary
		WHEN 1000, 2000 THEN 'low'
		WHEN 3000, 4000, 5000 THEN 'normal'
		WHEN 6000, 7000, 8000 THEN 'high'
		ELSE 'executive pay'
	END;
	DBMS_OUTPUT.PUT_LINE('Salary level is: ' || salary_level);
END;
/

-- Result:
Salary level is: high
DECLARE
    data_val NUMBER := 30;
    status VARCHAR2(20);
BEGIN
    status :=
	CASE data_val/2
		WHEN < 0, > 50 THEN 'outlier'
		WHEN BETWEEN 10 AND 30 THEN 'good'
		ELSE 'bad'
	END;
	DBMS_OUTPUT.PUT_LINE('The data status is: ' || status);
END;
/

-- Result:
The data status is: good
  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值