oracle 中函数的使用
-- oracle 中函数的使用--
-----------------------字符函数----------------------------
-- UPPER 函数,转换成大写
SELECT UPPER(TEST.TNAME)
FROM TEST;
-- LOSER 函数,转换成小写
SELECT LOWER(TEST.TNAME)
FROM TEST;
-- INITCAP 函数,将字符串中的单词的首字母转换成大写,其他字符转换成小写
SELECT INITCAP(TEST.TNAME)
FROM TEST;
-- CONCAT 函数, 将 字符串进行拼接然后显示。
SELECT CONCAT( TEST.TNAME , 'WU' ) "字符串拼接"
FROM TEST
WHERE TEST.TNAME = 'ZHANG';
SELECT TEST.TNAME || 'WU' "字符串拼接"
FROM TEST
WHERE TEST.TNAME = 'ZHANG';
-- SUBSTR 函数, 将 字符串进行截取
SELECT SUBSTR( TEST.TNAME, 1, 3 ) "字符串截取"
FROM TEST;
-- LENGTH 函数, 统计 字符串的长度
SELECT LENGTH( TEST.TNAME )
FROM TEST;
-- INSTR 函数, 统计 子字符串在字符串中第一次出现的位置
SELECT INSTR( TEST.TNAME, 'H' ) "第一次出现的位置"
FROM TEST;
SELECT INSTR( TEST.TNAME, 'ZH' )
FROM TEST;
-- LPAD 函数, 从最左边进行数据的拼接。
--函数规则 LPAD( "目标字符", 拼接之后的长度, 拼接的字符 )
/*如果拼接之后的长度,小于目标字符的长度,不进行拼接,只会从左截取目标字符相应长度的字符。
如果拼接之后的长度,小于目标字符的长度,会重复的拼接,直到拼接之后的字符长度满足要求。
如果拼接字符没有填写,默认在目标字符最左边添加空串。*/
SELECT LPAD( TEST.TNAME, 13, '1' )
FROM TEST;
-- RPAD 函数, 从最右边进行数据的拼接
SELECT RPAD( TEST.TNAME, 18, '123' )
FROM TEST;
-- TRIM 函数,
SELECT TRIM( TEST.TNAME ) "去掉首尾空格"
FROM TEST;
-- REPLACE 函数, 替换目标字符串中出现的所有的字符
-- 语法规则:REPLACE( 目标字符串,被替换的字符,替换字符 ),会替换目标字符串中出现的所有的字符。
SELECT REPLACE( TEST.TNAME, 'g' ,'G')
FROM TEST;
--------------- 数值型函数 ----------------
-- ROUND函数,四舍五入,可以精确小数位数
SELECT ROUND( TEST.AGE /3 ,2 )FROM TEST;
-- TRUNC函数,直接截取到相应的小数位数,不进行四舍五入运算
SELECT TRUNC( TEST.AGE / 3 , 2 )
FROM TEST;
-- FLOOR函数, 向下取整
SELECT FLOOR( TEST.AGE / 3)
FROM TEST;
-- MOD函数,返回算数运算后的余数. 规则: MOD(被除数,除数)
SELECT MOD( TEST.AGE , 3 )
FROM TEST;
-- ----------------------- 日期类型的函数 ------------------------
-- 获取系统当前时间
SELECT SYSDATE
FROM TEST;
-- 获取系统时间后一天的时间
SELECT SYSDATE + 1
FROM TEST;
-- 获取系统时间前一天的时间
SELECT SYSDATE - 1
FROM TEST;
-- 获取系统时间 与 某一个时间点间隔多少天
SELECT SYSDATE - TEST.HIREDATE
FROM TEST;
-- MONTHS_BETWEEN 两个时间点间隔几个月
SELECT MONTHS_BETWEEN(SYSDATE, TEST.HIREDATE)
FROM TEST;
-- ADD_MONTHS 在一个时间点上增加几个月或者减少几个月
SELECT ADD_MONTHS( SYSDATE, -1 )
FROM TEST;
SELECT ADD_MONTHS( SYSDATE, 1 )
FROM TEST;
-- LAST_DAY 指定日期的所在月的最后的一天的日期
SELECT LAST_DAY(SYSDATE)
FROM TEST;
-- EXTRACT 获取到指定日期的年,月,日。这些具体信息
/*
语法:EXTRACT( YEAR FROM 目标日期 ) 目标日期的年份
EXTRACT( MONTH FROM 目标日期 ) 目标日期的月份
EXTRACT( DAR FROM 目标日期 ) 目标日期的所在天
*/
SELECT EMP.ENAME,
EXTRACT(YEAR FROM EMP.HIREDATE) "年",
EXTRACT(MONTH FROM EMP.HIREDATE) "月",
EXTRACT(DAY FROM EMP.HIREDATE) "日"
FROM EMP;
------------------------------- 转换函数 ---------------------------
-- TO_CHAR(date, 格式) 函数。将日期格式的数据转换成字符串。
SELECT EMP.HIREDATE "日期格式数据", TO_CHAR( EMP.HIREDATE, 'YYYY-MM-DD HH24:MI:SS ' )
FROM EMP ;
-- TO_DATE( char, 格式 ) 函数。将字符格式转换成日期格式。
SELECT TO_DATE( '02-12月-1993' ) FROM EMP; -- 不指定固定格式的日期转换,字符串日期形式需满足 *(日)-*月-*(年)
SELECT TO_DATE( '1993-12-02','YYYY-MM-DD' ) FROM EMP; -- 指定格式的日期形式转换。
INSERT INTO EMP(EMP.EMPNO, EMP.HIREDATE)
VALUES('8996', TO_DATE( '1993-12-02 12:24:00','YYYY-MM-DD HH24:MI:SS' ) );
SELECT * FROM EMP;
-- TO_CHAR(number, 格式) 函数。将数字转换成字符串
SELECT TEST.SAL FROM TEST;
/**
* 将数字转换成 特定的字符串。
* L 代表前面加上一个本地的货币符。
* 9 代表显示数字,如果没有数字则不显示,有数字的话,显示数字。
* , 代表千分分割符。
* . 代表小数点分割符,后面有多少个数字9,代表有多少个小数。
* 0 代笔有数字则显示数字,如果没有数字,则强制显示为0。
*/
SELECT TEST.SAL ,TO_CHAR(TEST.SAL,'L999,999.999') FROM TEST;
SELECT TEST.SAL ,TO_CHAR(TEST.SAL,'L000,000.000') FROM TEST;
SELECT TEST.SAL ,TO_CHAR(TEST.SAL,'$999,999.999') FROM TEST;
-- TO_NUMBER(CHAR, 格式)。将字符串转换成数字
INSERT INTO EMP(EMP.EMPNO, EMP.SAL) VALUES(8997,TO_NUMBER('8997')) ;
INSERT INTO EMP(EMP.EMPNO, EMP.SAL) VALUES(9000,TO_NUMBER('$8,997.01','$9,999.00')) ;
----------------------------- 其他函数处理 --------------------------------------
INSERT INTO EMP(EMP.EMPNO) VALUES(8995);
SELECT * FROM EMP;
-- NVL(字段,代替值) 。将null值替换。
SELECT NVL(EMP.COMM, 0) FROM EMP WHERE EMP.EMPNO = '8995';
SELECT NVL(EMP.JOB, '') FROM EMP WHERE EMP.EMPNO = '8995';
SELECT NVL(EMP.HIREDATE, '') FROM EMP WHERE EMP.EMPNO = '8995';
-- NVL2(字段,值1,值2)。 如果字段的值不为null,则返回值1,如果为null,则返回值2。
SELECT NVL2(COMM, 100, 0) FROM EMP;
SELECT COMM FROM EMP;
-- NULLIF(表达式1,表达式2)。 比较两个表达式,如果两个表达式的值相等,则返回空值;
-- 如果两个表达式的值不相等,则返回 表达式1。
SELECT NULLIF( LENGTH(EMP.ENAME), 5 ) FROM EMP;
-- CASE 表达式。 可以实现 java逻辑上面的if(){} else{}
/* CASE expr
WHEN comparison_expr1 THEN return_expr1 expr1表达式和case后面的expr表达式相同,执行THEN 之后的表达式
[
WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr
]
END
*/
SELECT * FROM EMP;
SELECT EMP.ENAME , EMP.SAL,
CASE EMP.ENAME
WHEN 'SMITH' THEN EMP.SAL * (1+0.2)
WHEN 'ALLEN' THEN EMP.SAL * (1.5)
ELSE EMP.SAL
END AS "涨工资后"
FROM EMP
WHERE EMP.EMPNO BETWEEN 7369 AND 7782;
-- DECODE() 函数功能类似于CASE
/*
DECODE(col/expression, search1, result1 col或者expression的值与 search的值相同的话,执行result;
[, search2, result2,...,] 否则执行default后面的语句。
[, default])
*/
SELECT * FROM EMP;
SELECT EMP.EMPNO, EMP.SAL, EMP.JOB,
DECODE(EMP.JOB, 'CLERK', EMP.SAL * 1.2,
'SALESMAN', EMP.SAL * 1.5,
EMP.SAL
) AS "修正后的工资"
FROM EMP;