Oracle基础函数
--1,大小写控制函数
SELECT LOWER('Hello World') 转小写,
UPPER('Hello World') 转大写,
INITCAP('hello world') 首字母大写
FROM DUAL;
--2,字符控制函数
SELECT CONCAT('Hello','World') 字符连接
FROM DUAL;
--3,求字母串中的某个子串
SELECT SUBSTR('Hello World',3) FROM DUAL;
--截取从第3个字符到末尾
SELECT SUBSTR('Hello World',3,4) FROM DUAL;
--截取从第3个字符连续4个字符
--4,字符数和字节数
SELECT LENGTH('China') 字符数,
LENGTHB('China') 字节数
FROM DUAL;
--5,在母串中,查找子串的位置
SELECT INSTR('Hello World','ll')
FROM DUAL;
--6,左右填充,将abcd用*填充到10位
SELECT LPAD('abcd',10,'*') 左填充,
RPAD('abcd',10,'*') 右填充
FROM DUAL;
--7,去掉字符串前后指定的字符
SELECT TRIM('H' FROM 'Hello WorldH')
FROM DUAL;
--8,字符串替换函数
SELECT REPLACE('Hello World','l','*')
FROM DUAL;
--9,数字函数
SELECT ROUND(45.926,2) 四舍五入,
TRUNC(45.926,2) 截断,
MOD(1600,300) 求余
FROM DUAL;
--10,ROUND函数
SELECT ROUND(45.923,0) 整数位,
ROUND(45.923,-1) 十位,
ROUND(45.923,-2) 百位
FROM DUAL;
--11,显示当前日期
SELECT SYSDATE
FROM DUAL;
--12,指定格式显示时间
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')
FROM DUAL;
--13,显示昨天,今天和明天,加减数字
SELECT SYSDATE - 1 昨天,
SYSDATE 今天,
SYSDATE + 1 明天
FROM DUAL;
--14,两个日期相减,结果为相差的天数,查询员工
--信息,显示员工工龄,两个日期不能相加
SELECT EMPNO,ENAME,SYSDATE - HIREDATE 天
FROM EMP;
--15,查询员工信息,显示员工工龄,分别按照天,
--星期,月显示
SELECT EMPNO,ENAME,SYSDATE - HIREDATE 天,
(SYSDATE - HIREDATE)/7 星期, (SYSDATE - HIREDATE)/30 月
FROM EMP;
--16,两个日期相差的月数
SELECT (SYSDATE-HIREDATE)/30 方式一,
MONTHS_BETWEEN(SYSDATE,HIREDATE) 方式二
FROM EMP;
--17,在指定日期上加上若干月
SELECT ADD_MONTHS(SYSDATE,1) 下个月,
ADD_MONTHS(SYSDATE,123) "123个月后"
FROM DUAL;
--18,某个日期当月的最后一天
SELECT LAST_DAY(SYSDATE)
FROM DUAL;
--19,下周六
SELECT NEXT_DAY(SYSDATE,'星期五')
FROM DUAL;
--20,对日期进行四舍五入
SELECT ROUND(SYSDATE,'MONTH') 月,
ROUND(SYSDATE,'YEAR')
FROM DUAL;
--21,对日期进行截断
SELECT TRUNC(SYSDATE,'MONTH') 月,
ROUND(SYSDATE,'YEAR')
FROM DUAL;
--22,日期格式
SELECT *
FROM EMP
WHERE HIREDATE =
TO_DATE('1982-01-23','YYYY-MM-DD');
--23,以指定格式当前日期
SELECT TO_CHAR(SYSDATE,
'YYYY-MM-DD HH24:MI:SS"今天是"DAY')
FROM DUAL;
--24,查询员工信息,显示员工的编号,姓名,月薪,
--要求有货币代码(L),千位符(,),小数点
SELECT EMPNO,ENAME,
TO_CHAR(SAL,'L9,999.99')
FROM EMP;
--25,NVL(EXP1,EXP2):当exp1为空时,返回exp2
--NUL2(EXP1,EXP2,EXP3):当exp1有值,返回exp2;
--否则返回exp3
SELECT ENAME,SAL*12+NVL2(COMM,COMM,0) 年收入
FROM EMP;
--26,NULLIF(EXP1,EXP2),如果exp1=exp2,返回null
--否则exp1
SELECT NULLIF('ABC','ABC'),NULLIF('A','AG')
FROM DUAL;
--27,找到参数列表中,第一个不为空的值
SELECT ENAME,COMM,SAL,COALESCE(COMM,SAL)
FROM EMP;
--28,给员工涨工资,根据职位涨,总裁涨1000,
--经理涨600,其他员工涨400
SELECT ENAME,JOB,SAL 涨前工资,
CASE JOB
WHEN 'PRESIDENT' THEN SAL + 1000
WHEN 'MANAGER' THEN SAL + 600
ELSE SAL + 400
END
涨后工资
FROM EMP;
--
SELECT ENAME,JOB,SAL 涨前工资,
DECODE(JOB,'PRESIDENT',SAL + 1000,
'MANAGER',SAL + 600, SAL + 400) 涨后工资
FROM EMP;
--转换函数(Conversion Functions)
--转换函数将指定字符从一种类型转换为另一种
--通常这类函数遵循如下惯例:函数名称后面
--跟着转换类型以及输出类型。
--29,TO_CHAR(C):将NCHAR,NVARCHAR2,CLOB,NCLOB
--类型转换为CHAR类型
SELECT TO_CHAR('AABBCC')
FROM DUAL;
--30,TO_CHAR(D[,FMT]):将指定的时间(DATE,TIMESTAMP,
--TIMESTAMP WITH TIME ZONE)按照指定格式转换为
--VARCHAR2类型。
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS')
FROM DUAL;
--31,TO_CHAR(N,[,FMT])将指定数值n按照指定格式fmt
--转换为varchar2类型并返回
SELECT TO_CHAR(-100,'L999G99D99MI')
FROM DUAL;
--32,TO_DATE(C[,FMT[,NLS]])将char,nchar,
--varchar2,nvarchar2转换为日期类型,如果fmt
--参数不为空,则按照fmt中指定格式进行转换。
--注意这里的fmt参数,如果ftm为’J‘,则表示按照公元制
--(Julian day)转换,c则必须为大于0并小于5373484
--的正整数。为什么公元制的化,c的值必须不大于5373484
--呢?因为Oracle的DATE类型的取值范围是公元前
--4712年1月1日至公元9999年12月31日。
SELECT TO_DATE(2454334,'J')
FROM DUAL;
--33,TO_NUMBER(C,[,FMT[,NLS]])将char,nchar,
--varchar2,nvarchar2型字符串按照fmt中指定格式
--转换为数值类型并返回。
SELECT TO_NUMBER('-100.00','9G999D99')
FROM DUAL;
--34,DECODE(EXP,S1,R1,S2,R2,R[,DEF])可以
--把它理解成一个增强型的if else,只不过它
--并不通过多行语句,而是在一个函数内部实现if
--else的功能。exp作为初始参数,s作为对比值,
--相同则返回r,如果s有多个,则持续遍历所有s,
--知道某个条件为真为止,否则返回默认值def(
--如果指定了的话),如果没有默认值,并且前面
--的对比也都没有为真,则返回空。毫无疑问,
--decode是个非常重要的函数,在实现行转列等功能是,
--都会用到。
SELECT DECODE('a2','a1','true1','a2','true2',
'default')
FROM DUAL;
--35,GREATEST(N1,N2,...N)返回序列中的最大值
SELECT GREATEST(14,3,5,3)
FROM DUAL;
--36,LEAST(N1,N2,...N)返回序列中最小值
SELECT LEAST(12,3,5,5)
FROM DUAL;
--37,NULLIF(C1,C2)逻辑等于CASE WHEN C1 = C2
--THEN NULL ELSE C1 END
SELECT NULLIF('A','B'),NULLIF('A','A')
FROM DUAL;
--38,NVL(C1,C2)逻辑等价于IF C1 IS NULL THEN
--C2 ELSE C1 END,C1,C2可以是任何类型,如果两者
--类型不同,则oracle会自动将c2转换为c1的类型
SELECT NVL(NULL,'12')
FROM DUAL;
--39,NVL2(C1,C2,C3)如果c1非空则返回c2,如果c1为
--空则返回c3
SELECT NVL2('A','B','C') ,
NVL2(NULL,'B','C')
FROM DUAL;
--40,SYS_CONNECT_BY_PATH(COL,C)该函数只能应用于
--树状查询,返回通过c1连接的从根节点的路径,该
--函数必须与connect by子句共同使用