Oracle内置函数

一、Dual表

该表是Oracle中真实存在的一个表,任何用户都可以读取,多数情况下可以用在没有目标的SELECT查询语句中。它本身只包含了一个DUMMY字段。DUAL表对Oracle很重要,用户不要试图删除该表,一旦删除,Oracle将无法启动。

二、数值型函数

1.绝对值、取余、判断数值正负函数

(1)ABS(n)函数:用于返回绝对值。

SELECT ABS('100'),ABS(-50) FROM DUAL;
--OUTPUT:100, 50

(2)MOD(n2, n1)函数:返回n2除以n1的余数。

参数为任意数值或可以隐式转成数值的类型。如果n1为0,那么该函数将返回n2。

SELECT MOD(5,2), MOD(8/2,5),MOD('11',5),MOD(-10,6),MOD(3,0) FROM DUAL;
--OUTPUT:1, 4, 1, -4, 3

(3)SIGN(n)函数:返回参数n的符号。

正数返回1,0返回0,负数返回-1。但如果n为BINARY_FLOAT或BINARY_DOUBLE类型时,n>=0或者n=NaN函数会返回1。

SELECT SIGN('9'),SIGN(-9),SIGN(0.00),SIGN(-2*'9') FROM DUAL;
--OUTPUT:1, -1, 0, -1

2.三角函数

(1)COS(n)函数:用于返回参数n的余弦,n为弧度表示的角度。

SELECT COS(3.1415926),COS('3.1416926') FROM DUAL;
--OUTPUT:-0.99999999999999856406703032941211807559,-0.99999999500535754754861880392607652199

(2)其它三角函数

ACOS(n):返回n的反余弦值。

COSH(n):返回n的双曲余弦值。

SIN(n):返回n的正弦值。

SINH(n):返回n的双曲正弦值。

ASIN(n):返回n的反正弦值。

TAN(n):返回n的正切值。

TANH(n):返回n的双曲正切值。

ATAN(n):返回n的反正切值。

3.返回以指定数值为准整数的函数

(1)CEIL(n)函数:返回大于等于输入参数的最小整数。

该输入参数要求是十进制数值类型,或可以隐式地转换成数值的类型,可以是非整数。

SELECT CEIL(10),CEIL('10.5'),CEIL(-10.2) FROM DUAL;
--OUTPUT:10, 11, -10

(2)FLOOR(n)函数:返回小于或等于参数的最大整数。

该函数输入参数要求是十进制数值类型,或可以隐式地转换成数值的类型,可以是非整数。

SELECT FLOOR(10),FLOOR('10.5'),FLOOR(-10.2) FROM DUAL;
--OUTPUT:10, 10, -11

4.指数、对数函数

(1)POWER(n2,n1)函数:利用该函数可以得到n2的n1次幂的结果。

这两个参数为任意数值,但如果n2为负数,那么n1必须为整数。

SELECT POWER(5,2),POWER('5',2),POWER(5.5,2.5),POWER(-5,2), 5 * 5 FROM DUAL;
--OUTPUT:25, 25, 70.94253836732937201280515546736005249344, 25, 25

类似函数:EXP(n)函数,表示返回e的n次幂

(2)SQRT(n)函数:该函数返回n的平方根。

n为数字类型的时候不能为负数,将返回一个实数,当n为BINARY_FLOAT或BINARY_DOUBLE类型时,n<0将返回Nan。

SELECT SQRT(100),SQRT('64') FROM DUAL;
--OUTPUT:10, 8

(3)LOG(n1,n2)函数:返回以n1为底n2的对数。

n1是除1和0以外的任意正数,n2为正数。

SELECT LOG(10,100),LOG('10','1000'),LN(10) FROM DUAL;
--OUTPUT:2, 3, 2.3025850929940456840179914546843642076

类似函数:LN(n)函数,表示返回n的自然对数。

5.四舍五入截取函数

(1)ROUND(n,integer)函数:将数值n四舍五入成第二个参数指定的形式的十进制数。

参数integer要求是整数,如果不是整数,那么它将被自动截取为整数部分。当integer为正整数时,表示n被四舍五入为integer位小数。如果该参数为负数,则n被四舍五入至小数点向左integer位。

SELECT ROUND(3.1415926,3), ROUND(3.1416926,2.5),ROUND(13.1415926,-1) FROM DUAL;
--OUTPUT:3.142, 3.14, 10

(2)TRUNC(n,integer)函数:它把数值n根据integer的值进行截取。

SELECT TRUNC(3.1415926), TRUNC(3.1415926,4), TRUNC(3.1415926,2.5),TRUNC(13.1415926,-1) FROM DUAL;
--OUTPUT:3, 3.1415, 3.14, 10

三、字符串处理函数

1.系统日期、时间函数

(1)CHR(n[USING NCHAR_CS])函数:根据相应的字符集,把给定的ASCII码转换为字符。

USING NCHAR_CS指明字符集。

SELECT CHR(65) || CHR(67) ABC,CHR(54678) FROM DUAL;
--OUTPUT:AC, $

(2)ASCII(str)函数函数:返回参数首字母的ASCII码值。

该返回值总是以用户使用的字符集为基础的,如果用户的数据库字符集是7位的ASCII值,那就得到一ASCII码值。

SELECT ASCII('中'),ASCII('HELLO') FROM DUAL;
--OUTPUT:14989485, 72

2.获取字符串长度函数

(1){[LENGTH] | [LENGTHB] | [LENGTHC] | [LENGTH2] | [LENGTH4]} (str)函数:返回指定字符串的长度。

SELECT LENGTH('HELLO WORLD') FROM DUAL;
--OUTPUT:11

3.字符串截取函数

(1) {[SUBSTR] | [SUBSTRB] | [SUBSTRC] | [SUBSTR2] | [SUBSTR4]} (str,position[,substring_length])函数:该函数提供截取字符串的功能。

各参数表示含义如下:

SUBSTR:以字符为单位。

SUBSTRB:以字节为单位。

SUBSTRC:以unicode字符为单位。

SUBSTR2:以UCS2代码点为单位。

SUBSTR4:以UCS4代码点为单位。

str:原始字符串。

position:要截取字符串的开始位置。初始为1,如果该值为负数,则表示从str的右边算起。

substring_length:截取的长度。

SELECT SUBSTR('HELLO WORLD',3,4),SUBSTR('HELLO WORLD',-3,4),SUBSTRB('ABCDEFG',5,4.2) FROM DUAL;
--OUTPUT:LLO, RLD, EFG

4.字符串连接函数

(1)CONCAT(str1,str2)函数:该函数连接两个参数并返回,效果和连接符“||”相似。

SELECT CONCAT('HELLO',' WORLD') FROM DUAL;
--OUTPUT:HELLO WORLD

5.字符串搜索函数

(1){[INSTR] | [INSTRB] | [INSTRC] | [INSTR2] | [INSTR4]} (string, substring[,position[,occurrence]])函数:该函数可以让我们在指定的字符串中搜索是否存在另一个字符串。

各项参数表示含义如下:

INSTR:以字符为单位。

INSTRB:以字节为单位。

INSTRC:以unicode字符为单位。

INSTR2:以UCS2代码点为单位。

INSTR4:以UCS4代码点为单位。

string:待搜索的字符串。

substring:要搜索的字符串。

position:搜索的开始位置,默认为1,表示字符串左边第一个位置;如果为负数,则表示字符串的右边位置为起始位置。

occurrence:substring第几次出现,默认是1。

SELECT INSTR('CORPORATE FLOOR','OR', -3, 2),INSTRB('CORPORATE FLOOR','OR',5,2) FROM DUAL;
--OUTPUT:2, 14

6.字母大小写转换函数

(1)UPPER(str)函数:该函数将指定的参数全部转换成大写字母。

SELECT UPPER('hello world') FROM DUAL;
--OUTPUT:HELLO WORLD

(2)LOWER(str)函数:该函数将指定的参数全部转换成小写字母。

SELECT LOWER('HELLO WORLD') FROM DUAL;
--OUTPUT:hello world

(3)INITCAP(str)函数:该函数参数的所有单词首字母转换成大写字母。

SELECT INITCAP('hello world') FROM DUAL;
--OUTPUT:Hello World

7. 带排序参数的字母大小写转换函数

(1)NLS_INITCAP(str[,nlsparam])函数:将指定参数的第一个字母转换成大写。

nlsparam参数为可选参数,其设置可以到NLS_DATABASE_PARAMETERS表中查询。

SELECT NLS_INITCAP('hello world'),NLS_INITCAP('this is my cat','NLS_SORT=SCHINESE_STROKE_M') FROM DUAL;
--OUTPUT:Hello World, This Is My Cat

(2)NLS_UPPER(str[,nlsparam])函数:将指定参数变成大写。

nlsparam参数同NLS_INITCAP函数设置。

SELECT NLS_UPPER('this is my cat','NLS_SORT=SCHINESE_PINYIN_M') FROM DUAL;
--OUTPUT:THIS IS MY CAT

(3)NLS_LOWER(str[,nlsparam])函数:将指定参数转换成小写。

nlsparam参数同NLS_INITCAP函数设置。

SELECT NLS_LOWER('HELLO CHINA','NLS_SORT=XGerman') FROM DUAL;
--OUTPUT:hello china

8.为指定参数排序函数

(1)NLSSORT(str[,nlsparam])函数:根据nlsparam指定的方式对str进行排序。

9.替换字符串函数

(1)REPLACE(str,search_string[,replacement_string])函数:替换字符串的函数。

具体代表的含义如下:

str:表示搜索的目标字符串。

search_string:在目标字符串中要搜索的字符串。

replacement_string:该参数可选,用它可替代被搜索到的字符串,如果该参数不用,则表示从str参数中删除search_string字符串。

SELECT REPLACE('this is a dog','dog','cat') FROM DUAL;
--OUTPUT:this is a cat

10. 字符串填充函数

(1)RPAD(expr1,n[,expr2])函数:该函数功能是在字符串expr1的右边用字符串expr2填充,直到整个字符串长度为n时为止。如果expr2不存在,则以空格填充。

SELECT RPAD('--',6,'*') FROM DUAL;
--OUTPUT:--****

(2)LPAD(expr1,n[,expr2])函数:该函数功能是在字符串expr1的左边用字符串expr2填充,直到整个字符串长度为n时为止。如果expr2不存在,则以空格填充。

SELECT LPAD('--',6,'*') FROM DUAL;
--OUTPUT:****--

11. 删除字符串首尾指定字符的函数

(1)TRIM( [LEADING | TRAILING | BOTH] [trim_character FROM] trim_source)函数:该函数将删除指定的前缀或尾随的字符,默认删除空格。

SELECT TRIM('   HELLO WORLD') FROM DUAL;
--OUTPUT:HELLO WORLD

(2)RTRIM(str[,set])函数:与RPAD函数相反,该函数会提供将str右边出现在set中的字符删除掉。如果set没有,则默认删除空格。

SELECT LTRIM('-----HELLO WORLD*****','-') FROM DUAL;
--OUTPUT:HELLO WORLD*****

(3)LTRIM(str[,set])函数:与RTRIM函数相似,该函数会提供将str左边出现在set中的字符删除掉。如果set没有,则默认删除空格。

SELECT RTRIM('-----HELLO WORLD*****','*') FROM DUAL;
--OUTPUT:-----HELLO WORLD

12. 字符集名称和ID互换函数

(1)NLS_CHARSET_ID(string)函数:该函数可以得到字符集名称对应ID。

string表示字符集名称。

SELECT NLS_CHARSET_ID('US7ASCII') FROM DUAL;
--OUTPUT:1

(2)NLS_CHARSET_NAME(number)函数:该函数可以根据字符集ID得到对应名称。

number表示字符集ID。

SELECT NLS_CHARSET_NAME(3),NLS_CHARSET_NAME(1) FROM DUAL;
--OUTPUT:WE8HP, US7ASCII

四、日期型函数

1.系统日期、时间函数

(1)SYSDATE函数:可以得到系统的当前日期,

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MM:SS') FROM DUAL;
--OUTPUT:2021-08-15 18:08:12

(2)SYSTIMESTAMP函数:返回系统时间,该时间包含时区信息,精确到微秒。

SELECT SYSTIMESTAMP FROM DUAL;
--OUTPUT:15-8月 -21 06.52.55.442000000 下午 +08:00

2.得到数据库时区函数

(1)DBTIMEZONE函数:返回数据库时区。

SELECT DBTIMEZONE FROM DUAL;
--OUTPUT:+00:00

3.为日期加上指定月份函数

(1)ADD_MONTHS(date,integer)函数:该函数将返回在指定的日期上加一个月份数后的日期。

其中date表示指定的日期; integer表示要加的月份数,该值如果为负数,则表示减去的月份数。

需要注意,当指定的日期是月的最后一天时,最后函数返回的结果也将是新月的最后一天。而如果新的月份比指定日期月份的天数少,则函数将自动回调有效日期。

SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2021-8-15','YYYY-MM-DD'),3),'YYYY-MM-DD') FROM DUAL;
--OUTPUT:2021-11-15

(2)SESSIONTIMEZONE函数:可以返回当前会话的时区。

SELECT SESSIONTIMEZONE FROM DUAL;
--OUTPUT:Asia/Shanghai

4.返回指定月份最后一天函数

(1)LAST_DAY(date)函数:该函数返回参数指定日期对应月份的最后一天。

SELECT LAST_DAY(SYSDATE) FROM DUAL;
--OUTPUT:31-8月 -21

5.返回指定日期后一周的日期函数

(1)NEXT_DAY(date,str)函数:该函数返回当前日期向后的一周char的对应日期,char表示的是星期几,全称和缩写都允许。

SELECT SYSDATE,NEXT_DAY(SYSDATE,'星期二') FROM DUAL;
--OUTPUT:15-8月 -21, 17-8月 -21

6.返回会话所在时区当前日期函数

(1)CURRENT_DATE函数:该函数得到会话时区的当前日期。

SELECT SESSIONTIMEZONE, TO_CHAR(CURRENT_DATE,'YYYY-MM-DD') FROM DUAL;
--OUTPUT:Asia/Shanghai, 2021-08-15

7. 提取指定日期特定部分的函数

(1)EXTRACT (datetime)函数:该函数可以从指定的时间当中提取到指定的日期部分.

例如从给定的日期得到年、月、分等。

SELECT EXTRACT(YEAR FROM SYSDATE),
       EXTRACT(MINUTE FROM TIMESTAMP '2021-08-27 8:30:56'),
       EXTRACT(SECOND FROM TIMESTAMP '2021-08-27 8:30:56') 
  FROM DUAL;
--OUTPUT:2021, 30, 56

8.得到两个日期之间的月份数

(1)MONTHS_BETWEEN(date1,date2)函数:该函数返回date1和date2之间的月份数。

函数两个参数都为日期型数据。当date1>date2时,如果两个参数表示日期是某月中的同一天,或它们都是某月中的最后一天,则该函数返回一整型数;否则,将返回小数。当date1<date2时,则返回一负值。

SELECT MONTHS_BETWEEN(TO_DATE('2021-9-15','YYYY-MM-DD'), TO_DATE('2021-8-15','YYYY-MM-DD')) AS ONE,
       MONTHS_BETWEEN(TO_DATE('2021-9-15','YYYY-MM-DD'), TO_DATE('2021-10-15','YYYY-MM-DD')) AS TWO,
       MONTHS_BETWEEN(TO_DATE('2021-9-15','YYYY-MM-DD'), TO_DATE('2021-8-21','YYYY-MM-DD')) AS THREE 
  FROM DUAL;
--OUTPUT:1, -1, 0.8064516129032258064516129032258064516129

9.时区时间转换函数

(1)NEW_TIME(date,timezone1,timezone2)函数:该函数将返回时间date在时区timezone1转换到时区timezone2的时间。

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MM:SS'), 
       TO_CHAR(NEW_TIME(SYSDATE,'PDT','EST'),'YYYY-MM-DD HH24:MM:SS')
  FROM DUAL;
--OUTPUT:2021-08-15 20:08:29, 2021-08-15 22:08:29

10.日期四舍五入、截取函数

(1)ROUND(date[,fmt])函数:该函数将date舍入到fmt指定的形式。

如果参数fmt被省略,则date将被处理到最近的一天。

SELECT ROUND(SYSDATE,'YEAR') FROM DUAL;
--OUTPUT:01-8月 -21

(2)TRUNC(date[,fmt])函数:该函数将date截取到fmt指定的形式。

如果fmt省略,则截取到最近的日期。

SELECT TRUNC(SYSDATE,'MONTH') FROM DUAL;
--OUTPUT:01-8月 -21

更多用法参考:


五、转换函数

1.字符串转ASCII类型字符串函数

(1)ASCIISTR(str)函数:该函数可将任意字符集的字符串转换为数据库字符集对应的ASCII字符串。

SELECT ASCIISTR('世界,WORLD') FROM DUAL;
--OUTPUT:\4E16\754C,WORLD

2.二进制转十进制函数

(1)BIN_TO_NUM(data[,data...])函数:该函数可以将二进制转换成对应的十进制。data表示二进制数,一位用“,”隔开。

SELECT BIN_TO_NUM(1),BIN_TO_NUM(1,0,0),BIN_TO_NUM(1,0,0,0) FROM DUAL;
--OUTPUT:1, 4, 8

3.数据类型转换函数

(1)CAST(expr as type_name)函数:该函数是进行类型转换的,可以把expr参数转成type_name类型。基本上用于数字与字符之间以及字符与日期类型之间的转换。

SELECT CAST('258' AS INTEGER),
       CAST(258 AS VARCHAR2(6)),
       CAST(SYSDATE AS VARCHAR2(20)) 
  FROM DUAL;
--OUTPUT:258, 258, 15-8月 -21

具体规则参考:

4.字符串和ROWID相互转换函数

(1)CHARTOROWID(str)函数:该函数将字符串类型转成ROWID类型。

char为待转的字符串,其类型可以是CHAR、VARCHAR2、NCHAR、NVARCHAR2,但必须符合ROWID格式,长度为18。

SELECT T.ROWID,T.* FROM DUAL T;
SELECT CHARTOROWID('AAAACOAABAAAAWJAAA') FROM DUAL;
--OUTPUT:AAAACOAABAAAAWJAAA

(2)ROWIDTOCHAR(rowid)函数:该函数将行记录的ROWID转成字符串。参数rowid长度为18,所以返回结果长度18。

SELECT ROWIDTOCHAR('AAAACOAABAAAAWJAAA') FROM DUAL;
--OUTPUT:AAAACOAABAAAAWJAAA

(2)ROWIDTONCHAR(rowid)函数:同ROWIDTOCHAR(rowid)操作相同,但返回类型是NVARCHAR2。

SELECT ROWIDTONCHAR('AAAACOAABAAAAWJAAA') FROM DUAL;
--OUTPUT:AAAACOAABAAAAWJAAA

5.字符串在字符集间转换函数

(1)CONVERT(str,dest_char_sest[,source_char_set])函数:该函数用于把字符串从一个字符集转到另一个字符集。

各参数的表示含义如下:

str:等待转换的字符。可以是CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB、NCLOB类型。

dest_char_sest:转变后的字符集。

source_char_set:原字符集,如果没有该参数,则默认数据库实例字符集。

SELECT CONVERT('China', 'US7ASCII', 'ZHS16GBK') FROM DUAL;
--OUTPUT:China

6.十六进制字符串与RAW类型相互转换函数

(1)HEXTORAW(str)函数:该函数把十六进制的字符串转换成raw类型的数据。

SELECT HEXTORAW('4E') FROM DUAL;
--OUTPUT:4E

(2)RAWTOHEX(raw)函数:与HEXTORAW函数相反,它把raw类型表示成一个由十六进制字符表示的串,返回VARCHAR2类型。

SELECT RAWTOHEX('4E') FROM DUAL;
--OUTPUT:3445

(3)RAWTONHEX(raw)函数:同函数RAWTOHEX(raw)转换效果相同,不过返回的类型是NVARCHAR2类型,而不是VARCHAR2类型。

SELECT RAWTONHEX('4E') FROM DUAL;
--OUTPUT:3445

7.数值转换成字符型函数

(1)TO_DATE(str[,fmt[,nlsparam]])函数:该函数可将字符型数据转换成日期型数据。

各参数表示含义如下:

str:待转换的字符。

fmt:表示转换的格式。

nlsparam:控制格式化时使用的语言类型。

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MM:SS','NLS_DATE_LANGUAGE=ENGLISH') FROM DUAL;
--OUTPUT:2021-08-15 21:08:02

(2)TO_CHAR (n,[, fmt[,nlsparam]])函数:该函数将一个数值型参数转换成一个字符型数据。它同前面介绍的同名函数一样,只不过转换的对象变化了。

SELECT TO_CHAR(16.652,'99.99') FROM DUAL;
--OUTPUT:16.65

8.字符转日期型函数

(1)TO_DATE(str[,fmt[,nlsparam]])函数:该函数可将字符型数据转换成日期型数据。

各参数的具体含义如下:

str:待转换的字符。类型可以是CHAR、VARCHAR2、NCHAR、NVARCHAR2。

fmt:表示转换的格式。

nlsparam:控制格式化时使用的语言类型。

SELECT TO_DATE('2021-08-27','YYYY-MM-DD') FROM DUAL;
--OUTPUT:27-8月 -21

9.字符串转数字函数

(1)TO_NUMBER (expr[,fmt[,nlsparam]])函数:该函数将字符串转成数字。

各参数表示的具体含义如下:

expr:待转换的字符,其类型可以是CHAR、VARCHAR2、NCHAR、NVARCHAR2。

fmt:指定转换的数字格式。

nlsparam:该参数指定fmt的特征。通常包括小数点字符、组分隔符、本地钱币符号。

SELECT TO_NUMBER('1000.6562', '9999.9999') FROM DUAL;
--OUTPUT:1000.6562

10.全角转半角函数

(1)TO_SINGLE_BYTE(str):该函数将全角转为半角。

SELECT TO_SINGLE_BYTE('HELLO WORLD') FROM DUAL;
--OUTPUT:HELLO WORLD

六、NULL函数

1.返回表达式为NULL的函数

(1)COALESCE(expr)函数:返回列表中第一个不为null的表达式。如果都为null,则返回一个null。

SELECT COALESCE(NULL,9-9,NULL) FROM DUAL;