1、问题
最近又遇到新鲜的语句写法
bash
select count(1) from test
where (c1=5
or DECODE(c1, 1, 6, NULL, 6, c1) =6
);
计划:

首先语句主要的问题在于or条件
首先理解decode函数
bash
DECODE(expression, search1, result1, search2, result2,..., default_result)
expression:是要进行判断的表达式。
search1、search2等:是依次要与expression进行比较的值。
result1、result2等:是当expression与相应的search值相等时返回的结果。
default_result:是当expression与所有的search值都不相等时返回的默认结果。
那么可以得出
DECODE(c1, 1, 6, NULL, 6, c1) =6
C1=1结果赋值为6,null结果赋值为6,其他还是c1,最终满足等于6的条件。
还记得之前分享过形如(列 is null or 列等值)改写成nvl,此时利用举一反三思维,
最终其实就是求c1=5,1,null,然后null可以用nvl,最终
(c1=5
or DECODE(c1, 1, 6, NULL, 6, c1) =6
);
改成nvl(c1,6) in (1,5,6)
2、改写
bash
select count(1) from test
where (nvl(c1,6) in (1,5,6)
)
计划:

**
3、小结
**
本次想分享的是举一反三思路,null和or要思考之前or改写的案例,这样遇到同类场景就有优化的招数。