
case when条件判断与or之间的等价替换思考。
构造案例
构造数据
SQL> drop table if exists tt1;SQL> create table tt1 (id varchar2(20) primary key,code varchar2(4),c2 varchar2(20),ll int);SQL> insert into tt1 select 'A'||level,'0'||to_char(round(dbms_random.value(300,320),0)),'C'||to_char(round(dbms_random.value(1,5000),0)),2from dual connect by level<=20000;SQL> insert into tt1 select 'A'||level+200000,'03','C'||to_char(round(dbms_random.value(1,5000),0)),1from dual connect by level<=100;commit;
SQL> drop table if exists tt2;SQL> create table tt2 (id varchar2(20) primary key,code varchar2(4),ll int);SQL> insert into tt2 select 'A'||level,'0'||to_char(round(dbms_random.value(1,10),0)),2from dual connect by level<=10;SQL> insert into tt2 select 'A'||level+10000,'0'||to_char(round(dbms_random.value(300,320),0)),2from dual connect by level<=10;commit;
搜集表的统计信息:
dbms_stats.gather_table_stats('SYSDBA','TT1',null,100);dbms_stats.gather_table_stats('SYSDBA','TT2',null,100);
创建索引:
create index IDX_DM_TT1_CODE on tt1(code);create index IDX_DM_TT2_CODE on tt2(code);
查看执行计划:
SQL> set autotrace traceonlyselect count(*)from tt1, tt2where (tt1.code like casewhen tt1.ll = 1 thentt2.codewhen tt1.ll = 2 thentt2.code || '%'end);

技术分析
case when用于条件判断,语句用业务角度理解,假设ll是层级的意思,第一(基层)层级就获取本级别的数据;第二层级有权限获取下级的数据,做like关联获取本级及下级数据。最终展示两个层级的所有数据,就是层级1+层级2数据.
另外条件判断,要么满足条件1,要么满足条件2,or运算也属于条件判断,那么case when也可以改写成or。
SQL改写:
SQL> selectcount(*)from tt1, tt2where (tt1.ll = 1 and tt1.code = tt2.code)or (tt1.ll = 2 and tt1.code like tt2.code || '%');

语句where中出现case when判断,一般可以改写成or方式和union all方式,另外在等价改写中要注意等价替换,确保逻辑上是成立。
以上为本期分享,希望能带给大家帮助。想要了解更多往期干货,可访问页面最下方#达梦技术干货攻略#合集或下方相关分享。在此邀请更多学员参与“达梦技术干货投稿活动”,稿件获选后将在达梦“干货分享”专栏进行发布,欢迎来稿!
【干货攻略】SQL优化之-LIKE CASE WHEN改写思路(一)

文章转载自达梦E学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




