‘||’拼接条件写法的优化

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条件。

相关推荐
zcn1261 个月前
时间条件高效用法
数据库·sql优化改写
zcn1261 个月前
消除无关列
数据库·sql优化改写
zcn1262 个月前
先过滤后关联的优化经验分享
sql优化改写
zcn1262 个月前
union 和 union all的区别
sql优化改写
zcn1264 个月前
like关联改写
sql优化改写
zcn1264 个月前
OR关联改写经验
sql优化改写
zcn1266 个月前
标量子查询优化(二)
sql优化改写