概述
-
本章重点:条件语句和转化函数(格式符)
-
单行函数:一行记录返回一个结果(类比单元函数),如员工的年工资
-
多行函数:多行记录返回一个结果(类比多元函数),如公司的平均工资
字符函数
- 分别为转化为小写,大写和单词首字母大写,其余字母小写
实例1
- 以上适用于不知道King这个人名字拼写,索性直接全转化为大写
- 连接,提取子串,长度,位置,固定位数(补左),固定位数(补右),去除指定字符,替代指定字符
- LPAD:固定位数,用10位存数值信息,使用空格会更有效果(右对齐)
- SQL的索引从1开始
- INSTR不存在时输出0,类比Java输出-1(SQL索引从1开始,Java从0开始)
- SUBSTR的第二个参数指输出的字符数
- TRIM仅仅去除首尾的H,而REPALCE是替换全部的字符b
实例2
数字函数
- round函数的第二个参数指定小数位数,-2表示从个位向前数来四舍五入
- round默认四舍五入为一整数
- trunc直接截断,不管四舍五入
日期函数
- LAST_DAY操作数是date型,返回天数(不是小时)
- 日期的四舍五入通过判断过半与否,如月份没过半,则舍去
自动类型转换
- 关注上图中的转化关系(双向箭头)
- SQL中连接不是+,而是||
- 上图第一例显示date和number类型的自动转化
- 第二例可见逗号默认表示一列
显式类型转换
- 上例表示日期和字符串间转化(注释处为date——》字符串)
- tochar的第二个参数指定转化的格式
- 可将“-”替换为“/”,则输出结果也以“/”分隔
- 认识标识符:其用来指定转换的格式
-
上图的输出结果:
-
上例:在tochar方法的第二个参数中加入其他字符,如年月日,要用双引号括起来
特别字符
- 999表示数字,三个一set,中间逗号隔开,不足位数不补0
- 不足位数需要补0,用000,否则999
- 默认格式为保留到个位
- “L”和“$”:前者表示本地货币,后者为美元
- '123445’因为存储的是数字,不是汉字之类,本质上是数字型的字符
- “L”和“$”在转化方法(如tochar方法)的两个参数中要一一对应,如前面是$12,则后面也是’$999’
- 顺带提一句:解决了逗号表示列不能两者相加运算的问题
通用函数
-
expr看作输入行的某一列的信息
-
判断列的对应值是否为空,解决空值表达式仍然为空(比如想让奖金率为空时,当成0来计算)的问题
-
字符型数据但不是数字型字符,不能隐式转化
-
单行函数间相互嵌套,从内到外计算
-
NVL是NVL2的特殊情况
- NVL两个参数的数据类型应该相同,从而兼容
- 若保留到个位,可以省略第二个格式参数,即tochar方法就一个参数就OK
条件表达式
case
- case条件语句没有标点(有关键字来区分段落了)
- case +要比较的列名
- 可以起别名,作为新的列的名字
- where限制遍历的表内容
Decode
- decode方法的比较信息在括号内,不需要end, “)”即可表示end
- decode方法没有关键字,要用逗号区分段落
- decode方法的最后一行相当于else
练习
- 1,234,567.89带逗号说明是char类型
- 关注上图的有无特殊字符的两种情况
- date型转化为字符型
- 默认小数点后保留几位,使用round函数来保留一位
- 上述通过连接符成为一列数据,然后起别名
使用decode函数,按照下面的条件:
job | grade |
---|---|
AD_PRES | A |
ST_MAN | B |
IT_PROG | C |
SA_REP | D |
ST_CLERK | E |
产生下面的结果
Last_name | Job_id | Grade |
---|---|---|
king | AD_PRES | A |
- 若员工不在上述的五个部门,则表示else情况,但上式未写明,则输出的是null
- grade本身是字符,用单引号括起来
- 将上图的decode方式换为case方式实现条件语句