【Oracle】第三单元 单行函数

10 篇文章 1 订阅

dual为虚拟表

dual表是Oracle的一张虚拟表,这张表永远只有一条记录

select 10*9 from dual;

大小写转换函数

lower 全部转换成小写字母

select lower('SQL Course') from dual;

结果:sql course

upper全部转换成大写字母

select upper('SQL Course') from dual;

结果:SQL COURSE

inttcap全部转换成大写字母

select initcap(‘SQL course’) from dual;

结果:Sql Course

Oracle数据库中的数据是大小写敏感的

select employee_id,last_name,department_id from employees where last_name = 'higgins';

上面这样找不到数据 原因数据有大小写不一样

select employee_id,last_name,department_id from employees where lower(last_name) = 'higgins';

把表中所要查找的数据全部改成小写进行查找

字符串操作函数
函数结果说明
concat(‘Hello’,‘World’)HelloWorld把俩个单词拼接起来
substr(‘HelloWorld’,1,5)Hello从值得第1个字母开始截取到第5个
length(‘HelloWorld’)10字符串的长度
instr(‘HelloWorld’,‘W’)6W在字符串中处于第几位
lpad(salary,8,’#’)###24000向左用#补齐salary的值 直到8位
rpad(salary,8,’#’)24000###向右用#补齐salary的值 直到8位
trim(‘H’ from ‘HelloWorld’)elloWorld在字符串中去掉H
trim(’ HelloWorld ')HelloWorld什么都不加会去掉俩边的空格
trim(‘Hello World’)Hello World什么都不加不会去掉中间的空格

示例

select employee_id,
       concat(first_name, last_name) name,
       job_id,
       length(last_name),
       instr(last_name, 'a') "Contains 'a'?"
  from employees
 where substr(job_id, 4) = 'REP';
数字操作函数
函数结果说明
round(45.926, 2)45.93四舍五入保留俩位小数
trunc(45.926,2)45.92保留俩位小数后的直接舍去
mod(1600,300)100取余

示例:

select round(45.923, 2), round(45.923, 0), round(45.923, -1) from dual;

注:-1指的是小数点前面一位进行四舍五入,故第三个为50

select trunc(45.923, 2), trunc(45.923), trunc(45.923, -2) from dual;

注:-2指的是小数点前面俩位进行四舍五入,故第三个为0

select last_name,salary,mod(salary,5000) from employees where job_id=‘SA_REP’;

日期操作函数
函数结果说明
MONTHS_BETWEEN(‘01-SEP-95’,‘11-JAN-94’)19.6774比较俩个日期相差的月份
add_months(‘11-JAN-94’,6)1994-07-11日期加上相应的月份
NEXT_DAY (‘01-SEP-95’,‘FRIDAY’)1995-09-08日期的下一个星期五
select NEXT_DAY (‘01-SEP-95’,1) from dual;1995-09-03下一周的第一天 注:周日为第一天
last_day(‘01-FEB-95’)1995-02-28日期的最后一天
ROUND(‘25-JUL-95’,‘MONTH’)1995-08-01日 四舍五入
ROUND(‘25-JUL-95’ ,‘YEAR’)1996-01-01月份四舍五入
NEXT_DAY (TO_DATE(‘1995-09-01’,‘YYYY-MM-DD’),1)1995/9/3下一周第一天 转换成字符串否则会报错

可能会出错,原因是timestamp的日期格式 不同,解决办法如下:

alter session set nls_date_language='AMERICAN';

alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS.FF';

extract()函数:日期截取

select extract(day from sysdate) from dual

date类型中截取 year,month,day(date日期的格式为yyyy-mm-dd)

select extract(day from dt2 - dt1) day,
       extract(hour from dt2 - dt1) hour,
       extract(minute from dt2 - dt1) minute,
       extract(second from dt2 - dt1) second
  from (select to_timestamp('2011-02-04 15:07:00', 'yyyy-mm-dd hh24:mi:ss') dt1,
               to_timestamp('2011-05-17 19:08:46', 'yyyy-mm-dd hh24:mi:ss') dt2
          from dual)
select extract(year from systimestamp) year,
       extract(month from systimestamp) month,
       extract(day from systimestamp) day,
       extract(minute from systimestamp) minute,
       extract(second from systimestamp) second,
       extract(timezone_hour from systimestamp) th,
       extract(timezone_minute from systimestamp) tm,
       extract(timezone_region from systimestamp) tr,
       extract(timezone_abbr from systimestamp) ta
  from dual
TO_CHAR()函数:日期到字符串的转换
日期格式化元素说明
YYYY4位数字表示的年份
YEAR英文描述的年份
MM2位数字表示的月份
MONTH英文描述的月份
MON三个字母的英文描述月份简称
DD2位数字表示的日期
DAY英文描述的星期几
DY三个字母的英文描述的星期几简称
HH24:MI:SS AM时分秒的格式化
DDspth英文描述的月中第几天
fm格式化关键字,可选

示例:

select to_char(sysdate,'YYYY') FROM DUAL;

select to_char(sysdate,'DAY') FROM DUAL;

日期运算
SELECT last_name,
       SYSDATE - hire_date,
       (SYSDATE - hire_date) / 7 AS weeks,
       SYSDATE + 1 AS tomorrow,
       hire_date + 8 / 24
  FROM employees
 WHERE department_id = 90;

入职的天数

入职的多少周 除以7

明天的日期

计算入职的1/3天是是什么时间

Oracle 数据类型的 隐私转换规则

对于赋值操作可以:

VARCHAR2 or CHARNUMBER
VARCHAR2 or CHARDATE
NUMBERVARCHAR2
DATEVARCHAR2

对于表达式比较操作仅可以:

VARCHAR2 or CHARNUMBER
VARCHAR2 or CHARDATE
TO_CHAR() 函数:数字到字符串的转换
数字格式化元素说明
9表示一个数字
0强制显示0
$放一个美元占位符
L使用浮点本地币种符号
.显示一个小数点占位符
,显示一个千分位占位符

示例:

SELECT salary, TO_CHAR(salary, 'L99,999.00') SALARY FROM employees WHERE last_name = 'Ernst';

结果$6000

alter session set NLS_CURRENCY = '¥';

注:语言环境更改成人民币

SELECT salary, TO_CHAR(salary, 'L99,999.00') SALARY FROM employees WHERE last_name = 'Ernst';

结果¥6,000

TO_NUMBER()函数:字符串到数字的转换

TO_NUMBER应用正确与否
select to_number(‘4456’)from dual
select to_number(’$4,456’)from dual×
select to_number(’$4,456’,’$9,999’)from dual
select to_number(’$4,456,455.000’,’$9,999,999’)from dual×
select to_number(’$4,456,455.000’,’$9,999,999.999’)from dual

TO_DATE()函数:字符串到日期的转换

TO_DATE应用正确与否
select to_date(‘22-FEB-11’)from dual
select to_date(‘2011/2/22’)from dual×
select to_date(‘2011/2/22’,‘YYYY-MM-DD’)from dual
select to_date(‘2/22/2011’,‘MM-DD-YYYY’)from dual
select to_date(‘2011/FEB/22’,‘YYYY-MON-DD’)from dual
其他常用单行函数
函数说明
NVL (expr1, expr2)如果expr1为空,这返回expr2
NVL2 (expr1, expr2, expr3)如果expr1为空,这返回expr3(第2个结果)否则返回expr2
NULLIF (expr1, expr2)如果expr1和expr2相等,则返回空
COALESCE (expr1, expr2, …, exprn)如果expr1不为空,则返回expr1,结束;否则计算expr2,直到找到一个不为NULL的值 或者如果全部为NULL,也只能返回NULL了

示例:

SELECT last_name,
       salary,
       NVL(commission_pct, 0),
       (salary * 12) + (salary * 12 * NVL(commission_pct, 0)) AN_SAL
  FROM employees;
SELECT last_name,
       salary,
       commission_pct,
       NVL2(commission_pct, 'SAL+COMM', 'SAL') income
  FROM employees
 WHERE department_id IN (50, 80);
SELECT first_name,
       LENGTH(first_name) "expr1",
       last_name,
       LENGTH(last_name) "expr2",
       NULLIF(LENGTH(first_name), LENGTH(last_name)) result
  FROM employees;
条件表达式
CASE语句
SELECT last_name,
       job_id,
       salary,
       CASE job_id
         WHEN 'IT_PROG' THEN
          1.10 * salary
         WHEN 'ST_CLERK' THEN
          1.15 * salary
         WHEN 'SA_REP' THEN
          1.20 * salary
         ELSE
          salary
       END "REVISED_SALARY"
  FROM employees;
DECODE函数
SELECT last_name,
       job_id,
       salary,
       decode(job_id,
              'IT_PROG',
              1.10 * salary,
              'ST_CLERK',
              1.15 * salary,
              'SA_REP',
              1.20 * salary,
              salary) revised_salary
  FROM employees;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值