1 、问题
最近遇到一个有趣写法的语句,如下:
css
select count(1) from test where c1||yr in ('A1'||'2026','A2'||'2026','A3'||'2026');
计划:

计划是全表扫,'||'拼接条件的写法无法使用索引,'||'是拼接符,合并,相当于and,我们可以把条件做一下转换。
css
第一步
C1||yr in ('A1'||'2026') ->c1='A1' and yr='2026'
第二步
In条件是集合,union all合起来,
c1||yr in ('A1'||'2026','A2'||'2026','A3'||'2026')
转换为
c1='A1' and yr='2026'
union all
c1='A2' and yr='2026'
union all
c1='A3' and yr='2026'
第三步
Union all相当于or
c1='A1' and yr='2026'
union all
c1='A2' and yr='2026'
union all
c1='A3' and yr='2026'
转换为
c1='A1' and yr='2026' or c1='A2' and yr='2026'or c1='A3' and yr='2026'
其实in条件是or的逻辑运算,因此可以一步到位进行改写。
2、改写
css
select count(1) from test where ((c1 ='A1' and yr='2026') or (c1 ='A2' and yr='2026')
or (c1 ='A3' and yr='2026'));
计划:

效率提升几十倍以上。
3、小结
'||'拼接符相当于and,此时我们将拼接条件转换为and条件。