NVL 与 COALESCE 不为人知的区别
大家都知道的区别:
NVL | Oracle 专属 | 只支持两个参数 |
COALESCE | SQL 标准 | 支持多个参数 |
但是今天偶然间还发现一个重要差别:滥用 NVL 可能导致额外的计算
NVL | 无论前面的参数是否为 NULL 均会计算所有参数 |
COALESCE | 如果遇到一个不为 NULL 的参数,则不计算后面的表达式 |
以 PL/SQL 为例,NVL 的表现就如同一般的函数,但 COALESCE 更像是一个语句,可以成功避免进行耗时的运算;
SQL 中可能也是如此,欢迎读者自行验证并在评论区讨论!
DECLARE
l_n VARCHAR2(4000) := 'x';
l_s VARCHAR2(4000) := 'x';
FUNCTION Expensive_Function RETURN VARCHAR2 IS
BEGIN
Dbms_Output.Put_Line('Expensive_Function !!!');
RETURN 'x';
END Expensive_Function;
FUNCTION Common_Function(p_S1 IN VARCHAR2, p_S2 IN VARCHAR2)
RETURN VARCHAR2 IS
BEGIN
RETURN 'x';
END Common_Function;
PROCEDURE Common_Procedure(p_S1 IN VARCHAR2, p_S2 IN VARCHAR2) IS
BEGIN
RETURN;
END Common_Procedure;
BEGIN
Dbms_Output.Put_Line('Function');
l_s := Common_Function(l_n, Expensive_Function);
Dbms_Output.Put_Line('Procedure');
Common_Procedure(l_n, Expensive_Function);
Dbms_Output.Put_Line('Nvl');
l_s := Nvl(l_n, Expensive_Function); -- Nvl就像普通的函数一样,要先计算参数
Dbms_Output.Put_Line('Coalesce');
l_s := Coalesce(l_n, Expensive_Function); -- 非常特殊的函数,行为类似于 IF-ELSE CASE AND OR 不会进行多余的计算
Dbms_Output.Put_Line('CASE');
l_s := CASE l_s
WHEN 'x' THEN
'xxx'
WHEN Expensive_Function THEN
'yyy'
ELSE
Expensive_Function
END;
Dbms_Output.Put_Line('AND');
IF NOT (l_n IS NULL AND Expensive_Function IS NULL) THEN
NULL;
END IF;
Dbms_Output.Put_Line('OR');
IF l_n IS NOT NULL OR Expensive_Function IS NOT NULL THEN
NULL;
END IF;
END;
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一文了解HAProxy主要特性
本文转自Rancher Labs 在Kubernetes中,Ingress对象定义了一些路由规则,这些规则规定如何将一个客户端请求路由到指定服务,该服务运行在你的集群中。这些规则可以考虑到输入的HTTP消息的独特方面,包括其Host请求头和URL路径,这将允许你在请求中使用数据发现将流量从一个服务发送到另一个服务。那意味着你能够使用Ingress对象来为许多不同的应用程序定义路由。 虽然Ingress对象定义路由,但Ingress Controller是驱动它们的引擎。Ingress Controller是一个位于客户端和服务之间的代理,其作用是正确地传递消息。目前市面上已经有几个项目实现了Ingress Controller规范,每个项目都有其优势。Rancher提供了一个基于NGINX的默认controller,但你并不需要局限于此。Rancher已经和HAProxy达成合作,因此你也可以选择使用HAProxy Ingress Controller。我们倾向于把HAProxy Ingress Controller看作是一个完美的Kubernetes的涡轮增压引擎,能够充分提升Kub...
- 下一篇
Blind_pwn之格式化字符串
可能需要提前了解的知识 ● 格式化字符串原理&利用 ●got & plt 调用关系 ●程序的一般启动过程 原理 格式化字符串盲打指的是只给出可交互的 ip 地址与端口,不给出对应的 binary 文件来让我们无法通过 IDA 分析,其实这个和 BROP 差不多,不过 BROP 利用的是栈溢出,而这里我们利用的是无限格式化字符串漏洞,把在内存中的程序给dump下来。 一般来说,我们按照如下步骤进行 ●确定程序的位数(不同位数有些许差别) ●确定漏洞位置 ●利用 使用条件 ●可以读入 '\x00' 字符的 ●输出函数均是 '\x00' 截断的 ●能无限使用格式化字符串漏洞 32 位利用手法 实验环境准备 程序源码如下: #include <stdio.h> #include <string.h> #include <unistd.h> int main(int argc, char *argv[]) { setbuf(stdin, 0LL); setbuf(stdout, 0LL); ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块