Oracle 19C学习 - 05. 转换函数与条件表达式
(本博文采用的数据库是Oracle自带的hr用户范本数据库)
课程目标
隐式数据转换 与 显式数据转换
学习TO_CHAR, TO_NUMBER, TO_DATE转换函数的使用方法。
NULL通用函数
条件表达式
数据转换的类型
隐式数据转换: Oracle数据库自己进行的数据类型转换。
显示数据转换:用户操作来进行数据类型的转换。
隐式数据转换:
VARCHAR2 OR CHAR 与 DATE之间双向自动转换。
VARCHAR2 OR CHAR 与 NUMBER之间双向自动转换。
-- 字符串自动转为日期 01-10月-23 00:00:00 SELECT ADD_MONTHS('01-10月-22', 12) FROM dual; -- 日期自动转为字符串 今天日期: 03-10月-22 21:55:55 SELECT '今天日期: ' || sysdate FROM dual; -- 字符串自动转为数字 SELECT CEIL('25.99') FROM dual; --26 -- 数字自动转为字符串 25 / 3 的余数:1 SELECT '25 / 3 的余数:' || MOD(25,3) FROM dual;
显示数据转换:
CHAR与DATE: TO_DATE / TO_CHAR
CHAR与NUMBER:TO_NUMBER / TO_CHAR
使用TO_CHAR函数转换日期为字符串
TO_CHAR(Date, ‘Format_Model’)
Format_Model参数内容:
-- SQLDEVELOPER执行结果 --fm让数字显示的日和月都不带前导0, MONTH显示完整的月份信息 -没有fm看开头所以日期带前导0, MON显示缩写的月份信息。 SELECT TO_CHAR(TO_DATE('2010-9-3','YYYY-MM-DD'), 'fmDD-MONTH-YYYY') as with_FM, TO_CHAR(TO_DATE('2010-9-3','YYYY-MM-DD'), 'DD-MON-YYYY') as Without_FM FROM dual; /* OUTPUT WITH_FM WITHOUT_FM --------- ----------- 3-9月-2010 03-9月 -2010 */ -- SQLPLUS的执行结果 SQL> SELECT TO_CHAR(SYSDATE, 'YEAR-MON-DD HH:MI:SS AM') FROM dual; TO_CHAR(SYSDATE,'YEAR-MON-DDHH:MI:SSAM') ---------------------------------------------------------------------- TWENTY TWENTY-TWO-OCT-04 10:13:11 AM
使用TO_CHAR函数将数字转换为字符串
TO_CHAR(number, 'Format_Model')
Format_Model参数内容:
-- 格式字符串长度不够,会造成数据显示不开,变为####. -- 小数位长度不够会四舍五入进位。 SELECT TO_CHAR(99911199.99, 'L999,999,999.00') FROM dual; -- ¥99,911,199.99
SELECT USERENV('LANGUAGE') FROM dual; --显示语言信息,货币也是在这里决定的。SQLDeveloper和SQLPLUS的显示会有不同。
-- SQLDeveloper: SIMPLIFIED CHINESE_CHINA.AL32UTF8 SELECT USERENV('LANGUAGE') FROM dual; -- SQLPLUS: AMERICAN_AMERICA.AL32UTF8 SQL> SELECT USERENV('LANGUAGE') FROM dual;
使用TO_NUMBER函数将字符串转换为数字
TO_NUMBER(STR, [Format_Model]):将字符串转换为数字。
-- 没有格式的数字,直接转换,不需要格式字符串参数。 SELECT TO_NUMBER('20010') + 90 FROM dual; - 20100 -- 转换的时候,字符串要和格式字符串相匹配 SELECT TO_NUMBER('¥1,999.50' , 'L9,9999.99') FROM dual; --1999.5
使用TO_DATE函数将字符串转换为日期
TO_DATE(STR, 'FORMAT_MODEL'): 将字符串转换为日期类型。
SELECT TO_DATE('2020-FEB-28','YYYY-MON-DD') FROM dual; --根据数据的类型编写适应的Format Model。 TO_DATE('2020-FEB-2 ------------------- 2020-02-28 00:00:00
通用函数(与NULL有关系的函数)
NVL函数可以将空值转换为实际值, 转换的实际值可以是日期、字符和数字。
NVL(检测值,替换值): 当检测值为NULL的时候, 使用替换值替换, 替换值的类型要与字段的类型匹配。
SELECT last_name, NVL(commission_pct, 99) FROM employees; /* OUTPUT Davies 99 Vargas 99 Russell 0.4 Partners 0.3 */
NVL2将空值与非空值都进行替换。
NVL2(检测值, 非空转换值, 空值转换值): 当检测值为空的时候,转换为空值转换值。 不为空的,转换为非空转换值.
SELECT last_name, NVL2(commission_pct, 0, 1) FROM employees; /* OUTPUT Matos 1 Vargas 1 Russell 0 Partners 0 Errazuriz 0 */
NULLIF 比较两个数据,如果不相等,输出第一个数据,如果相等,输出NULL。
NULLIF(值1, 值2) 如果值1和值2不同,结果为值1;如果相同,则为NULL。
SELECT last_name, LENGTH(last_name), first_name, LENGTH(first_name), NULLIF(LENGTH(last_name), LENGTH(first_name)) FROM employees; /* Cambrault 9 Gerald 6 9 Cambrault 9 Nanette 7 9 Chen 4 John 4 (null) Chung 5 Kelly 5 (null) */
COALESCE的第一个表达式不为空,返回第一个表达式的值,否则返回第二个表达式。
COALESCE(表达式1, 表达式2):当表达式1中有NULL值,返回表达式2,否则结果为表达式1的计算结果。
SELECT last_name, commission_pct, COALESCE(salary * (1+commission_pct) , salary + 2000) FROM employees; /* OUTPUT Vargas (null) 4500 Russell 0.4 19600 Partners 0.3 17550 */
条件表达式 - CASE表达式
CASE [判断值] WHEN 比较值表达式 THEN 表达式
WHEN 比较值表达式 THEN 表达式
WHEN 比较值表达式 THEN 表达式
. . .
ELSE 表达式
END as 别名
CASE后给定字段,WHEN后面直接写字段的值, THEN写返回值。
CASE后不给定字段,WHEN后面写逻辑表达式, THEN写返回值。
-- CASE后有判断值 SELECT first_name || '.' || last_name, job_id, salary, CASE job_id WHEN 'IT_PROG' THEN salary * 1.1 WHEN 'ST_CLERK' THEN SALARY * 1.2 ELSE salary END as 工资调整 FROM employees WHERE JOB_ID IN ('IT_PROG', 'ST_CLERK'); /* Valli.Pataballa IT_PROG 4800 5280 Diana.Lorentz IT_PROG 4200 4620 Julia.Nayer ST_CLERK 3200 3840 Irene.Mikkilineni ST_CLERK 2700 3240 */ -- CASE后无判断值 SELECT first_name || '.' || last_name, job_id, salary, CASE WHEN job_id = 'IT_PROG' and salary <= 5000 THEN '工资过低' WHEN job_id = 'ST_CLERK' and salary > 3000 THEN '工资过高' ELSE '工资正常' END as 工资检查 FROM employees WHERE JOB_ID IN ('IT_PROG', 'ST_CLERK'); /* OUTPUT Bruce.Ernst IT_PROG 6000 工资正常 David.Austin IT_PROG 4800 工资过低 Valli.Pataballa IT_PROG 4800 工资过低 Diana.Lorentz IT_PROG 4200 工资过低 Julia.Nayer ST_CLERK 3200 工资过高 */
条件表达式 - DECODE函数
DECODE(判断值, 判断表达式1, 表达式1,
判断表达式1, 表达式1,
默认执行表达式) as 别名
SELECT last_name, job_id, salary, DECODE(job_id, 'IT_PROG', 8000, 'ST_CLERK', 4000, salary * 1.1) as revised_salary FROM employees WHERE JOB_ID IN ('IT_PROG', 'ST_CLERK', 'PU_CLERK'); /* Pataballa IT_PROG 4800 8000 Khoo PU_CLERK 3100 3410 Mikkilineni ST_CLERK 2700 4000 */
posted on 2021-05-02 23:49 LeoZhangJing 阅读(267) 评论(0) 编辑 收藏 举报