视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Oracle空值(null)有关的函数
2020-11-09 12:12:28 责编:小采
文档


环境:Oracle 10g一开始接触的就是pascal语言,所以,有的时候不是很喜欢c语言的语法。C语言中有一种偷懒的写法(java中也存在)

环境:Oracle 10g

一开始接触的就是pascal语言,所以,有的时候不是很喜欢c语言的语法。
C语言中有一种偷懒的写法(java中也存在),大概是这样:var:=(a>=b?1:2);
我不是很喜欢这样。
但事实是,这的确可以偷懒,而且已经存在了,所以得适应它。
PL/SQL中没有这种语法,SQL中也没有,盖因为,PL/SQL是类似与PASCAL的语法,但它们有实现类似功能的函数,而关于空值的函数中就有。

1)nvl(a,b)
最经典和简单的,详细的就不说了.可以用于任何地方。SELECT子句和WHERE子句等等中。

2)lnnvl(a)
a是一个表达式
lnnvl只能用于where子句中;表达式的操作符号不能包含 AND, OR, BETWEEN。
如果a的结果是false或者是unknown,那么lnnvl返回true;如果a的结果是true,返回false.
"如果a的结果是false或者是unknown,那么lnnvl返回true",这个很重要,因为一个空值或者unknown的值和另外一个常量或者有值的变量比较的时候,返回的总是unknown,所以
lnnvl(a>10) 等价于 nvl(a,0)<=10 等价于 a<=10 or a is null (假设a number(10))
说白了,lnnvl是一种特定的用于简化表达式的函数,orcle解析的时候,应该会解析为 "a<=10 or a is null".

3)nullif
开篇说了半天,PL/SQL中类似的就是这个函数。
格式: nullif(expr1,expr2) 等价于 "CASE WHEN expr1 = expr 2 THEN NULL ELSE expr1 END",
: expr1不能是标识符null,录入nullif(null,expr2)那么会提示错误。
expr1,expr2 都必须是一个变量或者是一个常量表达式,不能是逻辑表达式。
4)nvl2
也是一个类似c语言格式的函数.
格式:NVL2(EXPR1,EXPR2,EXPR3)
等价于: case when expr1 is null then expr2 else expr3 end
: 1) expr1可以是任意类型,,expr2,expr3不能是long类型。
2) 如果 expr2是字符类型,那么expr3转为字符型再比较(null除外)。
3) 如果 expr2是数值类型,那么expr3也转为对应的数值类型。
4) 各个参数都不能是逻辑表达式.

总结: 1) 各个其它函数基本可以转为为nvl,或者case when 的格式。
2) 除了方便之外,其实只掌握nvl和case when 已经足够了
3) 如果可以的话,偶尔用用也是可以带来些些方便。

下载本文
显示全文
专题