oracle SQL 当中的IF函数是什么

oracle SQL 当中的IF函数是什么,第1张

select A,case when A=0 then B when A=1 then C end from table

 或者

select A,decode(A,0,B,1,C) from table

where子句中对字段进行函数 *** 作,这将导致引擎放弃使用索引而进行全表扫描。

因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。

Oracle的自定义函数,提供了对逻辑的封装能力,便于我们对代码进行管理。然而当这个函数出现在where语句中,它却很可能给我们的SQL语句带来严重的效率问题。因为:

1、Oracle的优化器无法对函数进行优化,只能逐行执行(这就是为什么我们常发现,把函数里面的语句拷出来,就会执行得很快的原因)

2、函数并非标准SQL所包含的东西,因此Oracle在执行函数时,会频繁在SQL上下文和PL/SQL上下文之间切换。当数据量大时,就会增加CPU和内存的消耗,降低语句执行的效率。

因此,自定义函数,就像一把双刃剑一样,摆在了我们面前。对此,我们有以下几种对策:

1、不用函数

2、借用Oracle的缓存机制

3、函数索引

1)不用函数。不用函数确实能解决问题,但如果一段逻辑会被很多个SQL语句用到,这就会给我们的代码管理带来了很大的麻烦。因此这是万不得已的下下策。当然,没必要使用函数的地方,可以尽量避免。

2)借用Oracle的缓存机制。

Oracle对子查询,是会做缓存处理的。因此我们可以把函数写在一个子查询中,如把“my_func(id)”变成“(select my_func(id) from dual)”。这样做可以通过缓存,减少函数被调用的次数,从而提高效率。通常用函数对大数据量进行过滤时,此方法都可大量降低函数被调用的次数(可从Oracle的执行统计看出)

另一种方法,就是对函数强行开启结果缓存。方法是在函数的return类型之后,加上“result_cache”标记。

3)使用函数索引。首先该函数必须被标记为deterministic,即在函数的return类型之后,加上“deterministic”标记。它表示当函数的输入值是确定时,返回结果必定是唯一的。此后,在表的列上新建索引,索引列不是写列名,而是写“my_func(id)”这样即可。

通常地,我推荐先尝试“子查询缓存”这种方法。因为它不仅对函数、表本身没有作任何修改,而且效果也比较明显。我曾经试过对一条很复杂的SQL做了这种处理,结果执行效率提高了60倍之多!如果缓存效果不明显时,可以再尝试下函数索引。不过我发现同样的SQL,我只加函数索引的话,效果并不如“子查询缓存”那样立竿见影。

注意,以上提到的,都只是一些调优的手段而已,并非一定能解决问题。所以可以的话,我们还是要尽量避免把函数放在where语句中。

当然可以了。

比如类似这样就可以

select  from table_name where to_char(日期字段,'yyyymmdd')='20171223';

在Oracle中,可以使用SUM函数结合IF语句来实现一些特定的需求,例如根据条件对列值进行计算。下面是一个示例代码:

SELECT SUM(

IF(column1 > 0, column2, 0)

)

FROM table_name;

以上代码的含义为,在表“table_name”中查找所有“column1”大于0的记录,然后对每条记录的“column2”值进行求和。如果“column1”小于或等于0,则使用0替代其“column2”值。

在上述示例代码中,“IF”语句的逻辑是,如果“column1”大于0,则使用该记录的“column2”值;否则,使用0。它们嵌套在“SUM”函数内,这意味着对所有记录的结果求和,包括满足条件的记录的“column2”值,以及不满足条件的记录的0值。

需要注意的是,以上示例代码只是一种用法示例,具体应用需要根据实际情况进行调整。

oracle的if语句采用decode函数。

DECODE(value,if1,then1,if2,then2,if3,then3,,else)

表示如果value 等于if1时,DECODE函数的结果返回then1,,如果不等于任何一个if值,则返回else

示例:

比如,有个if语句如下

if(a==1){//如果a等于1,返回2,否则返回3

   return 2;

}else{

   return 3;

}

翻译成DECODE如下

DECODE(a,1,2,3)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12184529.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存