Oracle 单行函数

时间:2024-01-03 23:10:56

一、什么是函数

任何东西,只要它能接收输入,对输入进行加工并产生输出,它就可以被称为函数。

二、单行函数简介

单行函数只对表中的一行数据进行操作,并且对每一行数据只产生一个输出结果。单行函数可以接受一个或多个参数,其产生的输出结果的数据类型可能与参数的数据类型不同。

单行函数包含:

1.字符型

2.数字型

3.日期型

4.转换型

5.一般型函数

三、单行字符型函数

常用的字符型函数包括:

LOWER、UPPER、INITCAP、CONCAT、SUBSTR、LENGTH、INSTR、TRIM、REPLACE

1.LOWER(列名|表达式):该函数是把字符转换成小写。

SQL> select LOWER('SQL: Structural Query Language')
2 from dual; LOWER('SQL:STRUCTURALQUERYLANG
------------------------------
sql: structural query language

2.UPPER(列名|表达式):该函数是把字符转换成大写。

SQL> select upper ('sql is used exclusively in rdbmses')
2 from dual; UPPER('SQLISUSEDEXCLUSIVELYINRDBMS
----------------------------------
SQL IS USED EXCLUSIVELY IN RDBMSES

3.INITCAP(列名|表达式):该函数是把每个字的头一个字符转换成大写,其余的转换成小写。

SQL> select INITCAP('SQL is an ENGLISH LIKE language')
2 from dual; INITCAP('SQLISANENGLISHLIKELANG
-------------------------------
Sql Is An English Like Language

4.CONCAT(列名|表达式,列名|表达式):该函数是把头一个字符串和第二个字符串连接成一个字符串。

SQL> select CONCAT('SQL allows you to manipulate the data in DB',
2 ' without any programming knowlege')
3 from dual; CONCAT('SQLALLOWSYOUTOMANIPULATETHEDATAINDB','WITHOUTANYPROGRAMMINGKNOWLEGE'
----------------------------------------------------------------------------
SQL allows you to manipulate the data in DB without any programming knowlege

5.SUBSTR(列名|表达式,m,[n]):该函数是返回指定的字符串。该字符串是从第m个字符开始,其长度为n。

SQL> select SUBSTR('SQL lets you concentrate on what has to be done',14)
2 from dual; SUBSTR('SQLLETSYOUCONCENTRATEONWHA
----------------------------------
concentrate on what has to be done

在这个例子中我们省略了n,其结果是返回从第14个字符开始一直到结尾的所有字符。
    6.LENGTH(列名|表达式):该函数是返回列中或表达式中字符串的长度。

SQL> select LENGTH('SQL does not let you concentrate on how it will be achieved')
2 from dual; LENGTH('SQLDOESNOTLETYOUCONCENTRATEONHOWITWILLBEACHIEVED')
----------------------------------------------------------
59

7.INSTR(列名|表达式,'字符串',[m],[n]):该函数是返回所给字符串的数字位置,m表示从第m个字符开始搜索,n表示所给字符串出现的次数,它们的默认值都为1。

SQL> select INSTR('SQL allows for dynamic DB changes','F')
2 from dual; INSTR('SQLALLOWSFORDYNAMICDBCHANGES','F')
-----------------------------------------
0 SQL> select INSTR('SQL allows for dynamic DB changes','f')
2 from dual; INSTR('SQLALLOWSFORDYNAMICDBCHANGES','F')
-----------------------------------------
12

8.TRIM([leading|trailing|both]要去掉的字符FROM源字符串):该函数能够从“源字符串”中的头(leading)部,或尾(trailing)部,或从头(leading)部和尾(trailing)部(both)中去掉“要去掉的字符”。

如果没有指定头(leading)或尾(trailing),TRIM函数按默认(both)处理(该函数是8i刚刚引入的,在8i之前的版本中是两个函数LTRIM和RTRIM)。

SQL> select TRIM('?' FROM '?SQL*PLUS is the SQL implementation
2 used in an Oracle RDBMS or ORDBMS.')
3 from dual; TRIM('?'FROM'?SQL*PLUSISTHESQLIMPLEMENTATIONUSEDINANORACLERDBMSORORDBMS.')
--------------------------------------------------------------------------------
SQL*PLUS is the SQL implementation
used in an Oracle RDBMS or ORDBMS.

也可以通过下面的查询语句来去掉rows之后的两个问号。

SQL> select TRIM('?' FROM ' It can process data in sets of rows??')
2 from dual; TRIM('?'FROM'ITCANPROCESSDATAINSETSO
------------------------------------
It can process data in sets of rows

以上两个例子都没有指出是去掉头部的还是尾部的字符,因此Oracle按默认Both来处理。第一个例子只在头部有“?”而第二个例子只在尾部有“?”,所以Oracle系统可以正确的处理。
   下面的例子,TRIM函数的这种用法就要遇到麻烦了。

SQL> select TRIM('s' FROM 'sql*plus is a fourth generation query languages')
2 from dual; TRIM('S'FROM'SQL*PLUSISAFOURTHGENERATIONQUERY
---------------------------------------------
ql*plus is a fourth generation query language

在上面的SQL语句中,我们是想去掉尾部的“s”,但Oracle系统把开头的和结尾的“s”都去掉了。这显然不是我们所希望的结果。这时我们可以用trailing选项来解决这个问题。

SQL> select TRIM(trailing 's' FROM 'sql*plus is a fourth generation query languages')
2 from dual; TRIM(TRAILING'S'FROM'SQL*PLUSISAFOURTHGENERATI
----------------------------------------------
sql*plus is a fourth generation query language

在这里就不演示直接使用Leading选项的例子。
    9.REPLACE(正文表达式,要搜寻的字符串,替换字符串):该函数是在"正文表达式"中查找"要搜寻的字符串",如果找到了就用"替换字符串"替代。

SQL> select REPLACE('SQL*PLUS supports loops or if statements','supports',
2 'does not support')
3 from dual; REPLACE('SQL*PLUSSUPPORTSLOOPSORIFSTATEMENTS','S
------------------------------------------------
SQL*PLUS does not support loops or if statements

四、数字型函数
    常用的数字型函数包括:

ROUND、TRUNC、MOD

1.ROUND(列名|表达式,n):

该函数将列名或表达式所表示的数值四舍五入到小数点后的n位。

2.TRUNC(列名|表达式,n):

该函数将列名或表达式所表示的数值截取到小数点后的n位。

3.MOD(m,n):

该函数将m除以n并取余数。

SQL> select ROUND(168.888,1),TRUNC(168.888,1)
2 from dual; ROUND(168.888,1) TRUNC(168.888,1)
---------------- ----------------
168.9 168.8 SQL> select MOD(300,400)
2 from dual; MOD(300,400)
------------
300

五、日期函数
    首先演示一下查询数据库的时间例子:

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2013-07-07 09:44:36

常用的日期型函数包括:
    MONTHS_BETWEEN、ADD_MONTHS、NEXT_DAY、LAST_DAY

1.MONTHS_BETWEEN(日期1,日期2):

该函数是返回日期1和日期2之间的月数。如果日期1大于日期2,其返回的月数为正。如果日期1小于日期2,其返回的月数为负。

2.ADD_MONTHS(日期,n):

该函数是把n个月加到日期上。

3.NEXT_DAY(日期,字符串):

该函数是返回下一个由字符串(星期几)指定的日期。

4.LAST_DAY(日期):

该函数是返回该日期所在月的最后一天。

一个综合的例子:

SQL> select ename,hiredate,LAST_DAY(hiredate),NEXT_DAY(hiredate,'SUNDAY'),
2 MONTHS_BETWEEN(SYSDATE,hiredate) "Months",
3 ADD_MONTHS(hiredate,3) "Revies"
4 from emp; ENAME HIREDATE LAST_DAY( NEXT_DAY( Months Revies
---------- --------- --------- --------- ---------- ---------
SMITH 17-DEC-80 31-DEC-80 21-DEC-80 390.690779 17-MAR-81
ALLEN 20-FEB-81 28-FEB-81 22-FEB-81 388.594005 20-MAY-81
WARD 22-FEB-81 28-FEB-81 01-MAR-81 388.529489 22-MAY-81
JONES 02-APR-81 30-APR-81 05-APR-81 387.17465 02-JUL-81
MARTIN 28-SEP-81 30-SEP-81 04-OCT-81 381.33594 28-DEC-81
BLAKE 01-MAY-81 31-MAY-81 03-MAY-81 386.206908 01-AUG-81
CLARK 09-JUN-81 30-JUN-81 14-JUN-81 384.948844 09-SEP-81
SCOTT 19-APR-87 30-APR-87 26-APR-87 314.626263 19-JUL-87
KING 17-NOV-81 30-NOV-81 22-NOV-81 379.690779 17-FEB-82
TURNER 08-SEP-81 30-SEP-81 13-SEP-81 381.981102 08-DEC-81
ADAMS 23-MAY-87 31-MAY-87 24-MAY-87 313.497231 23-AUG-87
JAMES 03-DEC-81 31-DEC-81 06-DEC-81 379.142392 03-MAR-82
FORD 03-DEC-81 31-DEC-81 06-DEC-81 379.142392 03-MAR-82
MILLER 23-JAN-82 31-JAN-82 24-JAN-82 377.497231 23-APR-82 14 rows selected.

六、ROUND和TRUNC函数用于日期型数据
    除了可以把ROUND和TRUNC函数用于数字型数据外,还可以把ROUND和TRUNC函数用于日期型数据。

SQL> select ROUND(TO_DATE('25-JUL-13'),'MONTH')
2 from dual; ROUND(TO_
---------
01-AUG-13 SQL> select TRUNC(TO_DATE('25-JUL-13'),'MONTH')
2 from dual; TRUNC(TO_
---------
01-JUL-13 SQL> select ename,hiredate,ROUND(hiredate,'YEAR'),TRUNC(hiredate,'YEAR'),
2 ROUND(hiredate,'MONTH'),TRUNC(hiredate,'MONTH')
3 from emp
4 where hiredate like '%81'; ENAME HIREDATE ROUND(HIR TRUNC(HIR ROUND(HIR TRUNC(HIR
---------- --------- --------- --------- --------- ---------
ALLEN 20-FEB-81 01-JAN-81 01-JAN-81 01-MAR-81 01-FEB-81
WARD 22-FEB-81 01-JAN-81 01-JAN-81 01-MAR-81 01-FEB-81
JONES 02-APR-81 01-JAN-81 01-JAN-81 01-APR-81 01-APR-81
MARTIN 28-SEP-81 01-JAN-82 01-JAN-81 01-OCT-81 01-SEP-81
BLAKE 01-MAY-81 01-JAN-81 01-JAN-81 01-MAY-81 01-MAY-81
CLARK 09-JUN-81 01-JAN-81 01-JAN-81 01-JUN-81 01-JUN-81
KING 17-NOV-81 01-JAN-82 01-JAN-81 01-DEC-81 01-NOV-81
TURNER 08-SEP-81 01-JAN-82 01-JAN-81 01-SEP-81 01-SEP-81
JAMES 03-DEC-81 01-JAN-82 01-JAN-81 01-DEC-81 01-DEC-81
FORD 03-DEC-81 01-JAN-82 01-JAN-81 01-DEC-81 01-DEC-81 10 rows selected.

七、不同数据类型之间的隐含转换
    赋值语句中数据类型之间的隐含转换(Oracle自动转换):

1.将变长字符型(VARCHAR2)或定长字符型(CHAR)转换成数字型(NUMBER);

2.将变长字符型(VARCHAR2)或定长字符型(CHAR)转换成日期型(DATE);

3.将数字型(NUMBER)转换成变长字符型(VARCHAR2);

4.将日期型(DATE)转换成变长字符型(VARCHAR2)。

八、不同数据类型之间的显式转换

Oracle提供了3个转换函数来完成不同数据类型之间的显式转换。

TO_CHAR、TO_NUMBER、TO_DATE

1.TO_CHAR(日期,‘fmt'):

该函数的这种格式把日期型数据转换成变长字符串,其中,fmt为日期模式。

SQL> select ename,to_char(hiredate,'DD/MM/YY')
2 from emp
3 where hiredate like '%82'; ENAME TO_CHAR(
---------- --------
MILLER 23/01/82

常用的日期模式:
    a.YYYY:完整的年份数字表示(如2001);

b.YEAR:年份的英文表示(如NINETEEN EIGHTY-SEVEN);

c.MM:用两位数字来表示月份;

d.MONTH:月份完整的英文表示;

e.DY:用3个英文字符的缩写来表示星期几;

f.DAY:星期几的完整的英文表示;

g.DD:几号的数字表示。

查询员工的名字(Name),工资(Salary)和雇佣日期(HIREDATE)的信息。

SQL> select ename "Name",sal "Salary",
2 to_char(hiredate,'fmDdspth "of" Month Year fmHH:MI:SS AM') HIREDATE
3 from emp; Name Salary HIREDATE
---------- ---------- ----------------------------------------------------------------------------------------------------
SMITH 800 Seventeenth of December Nineteen Eighty 12:00:00 AM
ALLEN 1600 Twentieth of February Nineteen Eighty-One 12:00:00 AM
WARD 1250 Twenty-Second of February Nineteen Eighty-One 12:00:00 AM
JONES 2975 Second of April Nineteen Eighty-One 12:00:00 AM
MARTIN 1250 Twenty-Eighth of September Nineteen Eighty-One 12:00:00 AM
BLAKE 2850 First of May Nineteen Eighty-One 12:00:00 AM
CLARK 2450 Ninth of June Nineteen Eighty-One 12:00:00 AM
SCOTT 3000 Nineteenth of April Nineteen Eighty-Seven 12:00:00 AM
KING 5000 Seventeenth of November Nineteen Eighty-One 12:00:00 AM
TURNER 1500 Eighth of September Nineteen Eighty-One 12:00:00 AM
ADAMS 1100 Twenty-Third of May Nineteen Eighty-Seven 12:00:00 AM
JAMES 950 Third of December Nineteen Eighty-One 12:00:00 AM
FORD 3000 Third of December Nineteen Eighty-One 12:00:00 AM
MILLER 1300 Twenty-Third of January Nineteen Eighty-Two 12:00:00 AM 14 rows selected.

2.TO_CHAR(数字,‘fmt'):
    该函数的这种格式把数字型数据转换成变长字符串。

其中,fmt为数字模式。常用的数字模式包括:

9:位数字;

0:显示前导零;

$:显示美元号;

L:显示本地货币号;

.:显示小数点;

,:显示千位符;

MI:在数的右边显示减号;

PR:把负数用尖括号扩起来。

下面的查询语句用来显示员工的名字(Name)和年薪(Annual Salary),其中显示年薪时要包括美元($)符、千位符(,)和小数点(.),而且要显示小数点后两位数,即使小数点后的数为0也要显示。

SQL> select ename "Name",TO_CHAR(sal*12,'$99,999.00') "Annual Salary"
2 from emp; Name Annual Sala
---------- -----------
SMITH $9,600.00
ALLEN $19,200.00
WARD $15,000.00
JONES $35,700.00
MARTIN $15,000.00
BLAKE $34,200.00
CLARK $29,400.00
SCOTT $36,000.00
KING $60,000.00
TURNER $18,000.00
ADAMS $13,200.00
JAMES $11,400.00
FORD $36,000.00
MILLER $15,600.00 14 rows selected.

3.TO_NUMBER(字符串 [,'fmt]‘):
    该函数把字符串转换成数字。

4.TO_DATE(字符串 [,'fmt]’):

该函数把字符串转换成日期型数据。