00:01
刚才呢,我们讲了几类基本的单行函数,那最后呢,还剩一个叫做通用函数。那什么叫通用函数呢?我们看一下啊,常用的通用函数就是我们下边标识的这讲几个,他说这些函数是适用于任何数据类型的,同时也适用于空值,所以说我们给它起个名叫通用函数,通用嘛,对吧,前面我们讲了字符型的,日期型的啊,数字型的讲个转换函数,这个是通用的。同用的有哪几个叫NVR,其中有两个我们可以看作叫函数的参数,或者你要看做你要输入的这个单行,这个行的信息。行的某一列的一个信息对吧。那么还有一个叫NVL2。Now if。Colls什么意思?我们分别来看一下,第一个叫NVR,它能够用于将空值转化成一个已知的值。
01:04
当然,适用的类型都有。什么意思?比如我们这里给大家举两个例子你就知道了,第一个说求公司员工的年薪,求公司员工的年薪,那我们在。这个里边写一写,求公司员工的年薪含commission PT,我们知道这个呀,是说叫员工的,叫奖金率,之前我们求这个年薪的时候不含奖金率,12乘以salary,就这样啊,Select employee ID lastname。这是月薪对吧,我让他呀乘一个12说当做叫年薪,但这时候是不含奖金的。那含上奖金的时候,当时我们是不是说了一下,第一节我们就讲了一个变量,如果它是有可能含有空值的。
02:06
比如说这个奖金率,有些人没有奖金,当然也没有奖金率,那么它是一个空值的情况下,凡是空值参与运算的结果都为空。我们当时看了一下这个结果,发现非常的不理想。我们再来看一下。这里边我们看到啊,凡是这个commission PT不为空的,这个都计算是正确的,但为空的结果也整成空了,这不是我们所想的,我们希望怎么着啊,说你这个commission PPT,如果你要是空的时候,那你哪怕你当一个零,哪怕是零,对吧,来给我们做计算也行,当然我们知道那不等于零,但是我现在希望把它改成零,那我们这个时候就使用这个NVL。它用于你判断这个逗号前面的这样一个量,或者叫一个列,当它呀为空的时候,用后边一个值来代替。
03:05
明白,如果它要是不为空呢,那你就用本身的这个值为空了,用后边这个值来代替,这就是我们要讲的叫NVL,它的这个当express是吧,Express当这个一为不为空的时候,那你就是它本身,如果它为空了,就用这个值来代替。就是这样,那么我们还可以再给它起一个别名,别名用双引号。Annual salary,我这样来标识看一下公司员工的平均工资。这个时候我们发现每个人都有一个。哎,叫年薪,这个时候呢,就是当NVR为空的时候,用零来代替了,就解决了这样一个问题。这就是NV这样一个函数的作用。很清晰,我们再看下一个例子。
04:10
啊,输出lastname department ID,当department ID为now时,显示没有部门。这个题目的意思啊,就是说这个员工有的人啊,他是没有部门ID的,是这个意思吧,当他没有ID的时候,就意味着当他是闹的时候,显示没有部门。改成一个具体的一个值,来,我们写一下select。Last name department ID from employees where,那对对,我们就不加了,所有人都数出来,这呢,我们显示的是所有的。所有的人的这里边儿肯定是有一个肯定是有空的,不能不知道有几个对吧,我们找找那个在哪儿。
05:06
在这吧,这个人大家看这个人是没有部门的,我现在想让这给他添上几个值叫什么呀?没有部门,那我是不是就应该在这儿加上一个NVL啊,当你本身这个department不为空的时候,就写你自身,当你要是为空了,我用后一个来代替谁呀,没有部门。是这个想法吧,我们看一下,看这时候能不能出来。这里提示说叫无效数字。什么意思?给大家说一下,我们前面刚给大家讲了,叫转换函数,你看哈,这个是不是一个number类型的,这是不是一个字符型的。而且你字符型里边本身还不是存在这个123,本身还实际上还是数字的一个字符,它就是写的真的是汉字了,他俩就不能够隐式转化了,那你这个时候跟这个类型这个时候会有一个问题,就是不兼容,它俩类型不一样。
06:07
那怎么改成一样呢?改谁呀?当然是不是改这个departmentd更合适,怎么改?你不就是想把它转化成一个char类型的,跟后边这个没有部门也是差的,不就能对应了吗?那差to叉改成它,那后边这个怎么写啊。后边怎么写,你想怎么写就怎么写,写上个99999这样。嗯,再加个括号,这呢将一个number类型的转换一个叉型,然后呢,再使用一个NVR。嗯。大家看这时候是不是出来了。还是这个人显示没有部门,类型就匹配了,通过这个例子我们看到了这个NVR的一个使用,当类型不兼容的时候,我们要使用到转换函数。实际上这个问题还可以再简略减省,我们讲前面那个round跟创的时候说,如果那个是逗号,保留到第零位的时候就可以省略,这儿呢,你你又不指定具体是什么样子,我就直接这样写,你看看。
07:13
是不是也可以啊,也行,这是给大家说的一点,另外一点呢,从这个例子当中我们也看到了。我们讲的单行函数之间啊,是可以嵌套的。这里边儿我们就两层,内层转换型,外层通用型,计算的时候先计算内层的,然后再计算外层。也就是说多这个单行函数之间可以相互嵌套,计算的时候从内到外,这是我们这个例子要说明的,通过它呀,我们讲清楚NVL的使用,下边有个叫NVL2有三个参数。123这个函数什么意思啊,说当这个嗯,一这个表达式不为空的时候,返回二,为空的时候返回三,当它不为空,返回二。
08:05
哎,当他唯恐返回哎,当当当那个一唯恐返回三。大家你想一想这个函数。是不是刚才我们讲了一个NVRNVNVNVL,是不是可以看成NVR的一个特殊化呀?怎么叫特殊化呀,你看我把这个二改成一的时候,你再看当它不为空的时候,输入它就是不为空,输入它本身为空的话,输入这个,这是不是就已经这这这就是NVL啊。是NVL吧,所以说这个NVL2是NVR的一个一般化。是它的一个一般化,那么这个呢也不难,我们就举一个例子吧,等C。我们看这个题目。查询员工的奖金率,若为空,返回0.01,若不为空,返回实际的奖金率加上0.015好,Select lastname。
09:16
返回它的奖金率,我先写上一个啥也不用的pers PT,然后NVL2。第七题当你要是为空的时候,返回0.1不为空,我们先写的是不为空的吧。是不位空的时候先写这个,后边这个。好,那就是肯M,它加上0.015,如果唯孔输出0.01。
10:03
Employee。我们看这个结果。这是为空的时候,就0.01呗,如果你要是不为空,输出你这个值再加上一个0.015。就是后边这个。当我们把。加0.051去这个函数,它实际上表示的是不是就是NVL啊。所以说NV2是它的一个特殊化,特殊化。此时,这都一样。都一样,好,这是NV2,后边还有一个叫呃,Now if now if,就是这两个,如果相等的时候返回,Now,不等的时候返回,嗯,这个这个表达式一,这个我们就不具体举例子了,你看下边这个内容。这是一个一个例子说这是一个firstname,判断一下这个人的,这是我们这个表,Employee这个表。
11:02
他的firstname属于叫名了,外国人的,这个名是写在前面,姓写在后边。对吧,所以firstname是名,名呢你看它的长度,然后姓的长度,判断它俩相不相等,如果相等的时候返回now,所以说你看这一条记录叫不是吧,这个人呢都是五,所以他就返回闹,如果说这两个前后值不一样,返回前者那个。EXPRESS1的这个长度就行了。If后边还有一个叫Co,这个什么意思啊,说它相比这个优点,它可以处处理多个交替的值,如果第一个表达式值为空,返回下一个表达式,如果下一个表达式值为空,再往下。就这意思,Commit PPT没空的时候返回salary,如果salary还被空,再返回第三个,第三个再得空,再往后。依次这样下去。这个我们也就不举例了,我们常用的就NVR,或者你再不行,整个一般的NV2掌握了就可以了,我们重点来给大家讲讲,这个叫条件表达式。
12:06
在歇后语中使用if赠else逻辑两种表达的方式,一种叫kiss,一种叫抵扣。我们讲扎Java的时候,大家回顾一下啊,我们讲Java的时候使用条件的时候,讲了一个叫if else if跟else,或者我们再可以把那个Switch case。嗯,算上。讲了两个,那么在这儿呢,也有两个,一个叫kiss型的,一个叫抵扣型的,那么他们的格式怎么来写,怎么来使用,我们一个一个来说,先看这个case的。这是case的格式。K,谁选一个变量啊,那么这个值当它等于这个表达式的时候怎么来处理?当它等于这个表达式的时候怎么来处理?最后加个else都不是的时候怎么处理?End表示结束。
13:02
也就是case when then when then else and。我们以这个例子来说明一下这个case的使用。好,我们看一下查询部门号为12,十三十的员工信息,那我们先写上一个框。Lastname department ID employees,他说只查询是不是就是三啊,那就是where department ID in,十二十三十,这样写吧,这是我们之前讲的啊,就这样来操作。
14:14
下边有条件了,当这个部门号是十的时候,打印其工资的1.1倍。20号的时候打赢这个多,30号打这么多。来有一个条件了,这个时候怎么来写呢?是不是他这个时候的条件是什么呀,是不是以部门ID作为区别的呀,所以那叫case case谁啊第一。可以判断ID,当你这个ID。Case department问等于十的时候问吧,怎么着啊?Salary让它乘以1.1。
15:03
然后再问再次,这个时候大家你需要注意一点什么呀,没有标点,我们这儿呢,来区分不同的列有逗号,再往后的时候,这一段都是没有标点的,问20正1.2。嗯,在你写个问也行,问30,再salary乘以。1.3,或者我们这时候是不是已经,嗯,最后也没有二了,是吧,那我就因为你这还加了一个不是十号20就是30,你这可以是不是可以这样写了。就是。Else的时候,Salary这样来处理,然后end吧,结束了。表示我们整个的处理结束,结束的时候你还可以给这个生成的这个列起个别名,New SR就是新的,作为一个新的列名叫new salary。
16:10
哎,十二十三十三十个部门OK,看结果。十号,23,十号部门,这是他们的new salary就是新的工资,就是这样来写,大家你注意一下格式哈,Case就是你要比的哪一列这个值当它为十二十或其他的时候,Z表示如何来处理,最后N的结束,可以再起一个别名,别名别的谁,别的它。如果这个题目我还想实现这样的功能,我这样来写,看看,我这里不加where了。然后呢,那你这是不是就不能这样写了,就得是问吧。When 30then这样写,然后呢,Else else的这个salary就等于自身的再叫new salary。
17:07
只不过这个时候是不是把所有人的这个都给都给打印出来了呀。那就说明你,而那就说明啥,你最后这个是把这个整个表遍历了一遍,而刚才那个表呢,只是把刚才你需要的这个where的这一块给电路。这个效率更高一点,对吧。这是我们使用的叫case问问证,Else and。大家你如果把Java里边那个条件语句掌握好的话,这个呢就是一个方法,你唯一需要注意的就是这个格式。标点大家没有都没有,你大家你想一想,你这个时候实际上加个标点啊,我说是多余的,你能不能理解。为什么是多余的呀?我们学语言加标点的目的不就是为了区分这个语句的一个段落吗?啊,表示的意思对吧,我这儿呢,既然都已经有了下一个问了,已经表示下一个开始的,所以你这个逗号我说是多余的。
18:05
那你这呢,因为有个下边有个else了,所以这个逗号也是多余的,我们就都省略了,就不用标点了。这是我们讲的case。这儿还有一个例子。它呢,是以这个job ID为区分的,所以叫kiss job ID,当这个job ID等于这个的时候这样处理,问Z,问Z,然后else,除此之外salary不变。加个N的结束,起一个新的名字。From employees,最后给他对一下。一个意思啊,大家通过这样两个例子,你熟悉一下,使用his文N。第二个呢,叫抵扣的,抵扣的。啥意思?大家看这个例子。还是以照白ID为例,它呢,抵扣的后边有一对小括号,把你整个这个比较的这个信息放在小括号里,最后它没有end结束了,因为你有小括号嘛,这个小括号不就相当于是一个end的嘛,然后起了一个别名。
19:13
就是还是把刚才那个这里边举的这个例子照白D,当时他的时候用它,它的时候用它最后一个相当于它就是else的情况。哎,那我们也把我们刚才写的这个给改成一个什么呀。改成一个decode的。来,我们改一下。到这儿。这不变吧,Like他他他,然后抵扣,抵扣的第一个。你们的ID?方madd,然后呢,判断当你是十的时候,这个是有逗号的,因为你没有这个问跟Z的关键字了,那你得用逗号来区分是下一个字段了,当你是十号部门的时候,我让你的工资加上加上0.1就乘以1.1,这也有一个逗号。
20:17
当时20的时候,1.2。在30 30的话又是相当于else了,我就直接叫salary一个括号,这个括号刚才说了,其实就相当于这个里的end。那这个else是谁来相当于啊,你就最后一个了,最后一个它自然的就是else了嘛,因为你这也没有相对应的这个,哎,这个后边这个问的这个信息了,这不也省略问了吗?只有这个else这个的话,它就是。跟这个一样啊,最后呢,你也可以起一个别名new salary。
21:02
这是不是把它拿过来。一样,跟我们刚才操作方操作这个效果是一样的,这是使用这个抵扣的方式,大家你熟悉一下抵扣的,把刚才的这个case后的这个信息放在括号里,然后呢,这是相当于when,就是then when then else是它这个呢,小括号表示的是结束new salary。大家你把这个给它弄熟一点。哎,把它弄熟一点啊,这个我就不保存了,大家你把这个看一看,然后呢,这个画面你也可以切一下,把这两个例子为代表的熟悉一下decode和case。在后边呢,就没有啥了,这嵌套我们刚才实际上也讲了,说哎,单行函数之间是可以嵌套的,计算的时候从内到外,那么我们这一章。
22:02
我这一节就讲完了两个重点,一个是转换函数,使用函数改变数据类型,就是使用转换函数呗,这是我们的一个重点,后边会经常用,再一个呢,就是使用这个条件表达式。这是两个重点,其他的这一些字符型的呀,日记型的呀,通用型啊。比较简单,大家你把那几个函数相应的熟悉一下,敲一敲就行,好,我们这一节就到这,然后下面一节给大家先把这个练习说一下。
我来说两句