Oracle 常用系统函数

Ø  简介

本文主要来梳理下 Oracle 中的常用的系统函数,掌握这些函数的使用,对于我们编写 SQL 语句或 PL/SQL 代码时很有帮助,所以这也是必须掌握的知识点。

 

Oracle 中或者其他数据库中都存在两大类函数:

Ø  第一类,单行函数,表现形式为对每一行中指定的数据进行计算或处理,并返回计算后的结果。例如:

SELECT REPLACE(ename, 'A', 'a') ename, t.* FROM emp t;

clip_image002

 

Ø  第二类,则是多行函数,表现形式为将多行的数据进行计算或处理,并返回计算后的结果,例如:

SELECT t.deptno, AVG(sal) avgsal FROM emp t GROUP BY deptno;

clip_image003

表示,将分组后的多行进行平均值计算,即多行计算函数。

 

本文主要包括以下函数介绍:

1.   字符串函数

2.   数值函数

3.   日期函数

4.   转换函数

5.   NULL 函数

6.   聚合函数

7.   系统函数

8.   其他函数

 

1.   字符串函数

1)   length

语法:length(p_string)

解释:返回字符串的字符长度,如果 p_string NULL 或为空,则返回 NULL

示例:

SELECT length('ab 中国') col1, length(' ') Col2, length('') Col3, length(NULL) Col4 FROM dual;

clip_image004

 

2)   lengthb

语法:lengthb(p_string)

解释:返回字符串的字节长度,如果 p_string NULL 或为空,则返回 NULL

示例:

SELECT lengthb('ab 中国') col1, lengthb(' ') Col2, lengthb('') Col3, lengthb(NULL) Col4 FROM dual;

clip_image005

说明:Col1 中包含两个中文“中国”,一个中文占两个字节,所以一共是7个字节。

 

3)   ascii

语法:ascii(p_character)

参数:

p_character: 要检索 ASCII 码的字符,如果包含多个字符,只返回第一个字符的 ASCII 码,忽略之后的所有字符。

解释:返回指定字符对应的 ASCII 码。该函数与 char 函数功能是相反的。

示例:

SELECT ascii('') col1, ascii('A') col2, ascii('a') col3, ascii('0') col4, ascii(' ') col5, ascii('abc') col6 FROM dual;

clip_image006

 

4)   chr

语法:chr(p_number [using nchar_cs])

参数:

p_number: 用于检索的 ASCII 码数字代码。

using nchar_cs: 如果指定该参数,将返回国家字符集相对应的字符。

解释:返回指定 ASCII 码对应的字符。该函数与 ascii 函数功能是相反的。

示例:

SELECT chr(49390) col1, chr(65) col1, chr(97) col3, chr(48) col4, chr(32) col5, chr(49390 using nchar_cs) col6 FROM dual;

clip_image007

 

5)   cancat

语法:cancat(p_value1, p_value2)

参数:

p_value1: 要连接的第一个值(可以是非字符类型);

p_value2: 要连接的第二个值(可以是非字符类型);

解释:用于连接两个值,这个值可以是数字、日期、或其他类型。cancat 之所以可以传递非字符类型,应该是在函数内部进行了类型转换(个人分析)。

示例:

SELECT concat('he', 'llo') col1, concat('数字:', 12.5) col2, concat('日期:', sysdate) col3, concat('NULL', NULL) col4 FROM dual;

clip_image008

 

通常情况下,我们连接字符串习惯用"||"连接符,而不是使用 cancat 函数,因为 cancat 函数同时只能连接两个字符串,而"||"连接符可以同时连接多个,例如:

SELECT (123 || 12.5 || sysdate || '很晚了') col1, concat('该睡觉了', '吗?') col2 FROM dual;

clip_image009

 

6)   upper

语法:upper(p_string)

解释:将指定的字符串中的所有字母都转为大写

示例:

SELECT upper('Hello woRld') col1, upper('中国') col2, upper(NULL) col3 FROM dual;

clip_image010

 

7)   lower

语法:lower(p_string)

解释:将指定的字符串中的所有字母都转为小写

示例:

SELECT lower('hEllo ABEAM') col1, lower('中国') col2, lower(NULL) col3 FROM dual;

clip_image011

 

8)   initcap

语法:initcap(p_string)

参数:

p_string: 需要转换的单词字符串。

解释:返回指定单词字符串转换后的字符串,通过(空格、制表符、回车符、换页符、垂直制表符、换行符)分隔每个单词,将首字母转为大写,其他字母全部转为小写。

示例:

SELECT initcap('hello World') col1, initcap('_ello 2orld') col2, initcap('HELLO WORLD') col3, initcap('中国') col4, initcap(NULL) col5 FROM dual;

clip_image012

注意:如果第一个字符不是字母,将继续寻找下一个为字母的字符进行转换,直到遇到第一个为字母的字符。

 

9)   substr

语法:substr(p_string, p_start_position [, p_length])

参数:

p_string: 源字符串;

p_start_position: 提取子字符串的起始位置(包含该位置的子串);

p_length: 可选的。提取子字符串的长度,如果省略该参数,将从 p_start_position 指定的位置提取到源字符串的结尾。

解释:从源字符串中提取子字符串。

示例:

SELECT substr('hello', 2) col, substr('hello', 2, 2) col2, substr('hello', 7) col3, substr('hello', 0) col4, substr('hello', -1) col5, substr('hello', -3, 3) col6, substr('hello', 1, -1) col7 FROM dual;

clip_image013

注意:

Ø  p_start_position 为负数时,将从字符串末尾向开始计算起始位置,并向后开始取指定长度;

Ø  p_length 为负数时,将返回 NULL

 

10)  substrb

语法:substrb(p_string, p_start_position [, p_length])

参数:与 substr 函数相同。

解释:从源字符串中提取子字符串,注意:substrb 是按字节位置和长度进行提取的,而不是字符。

示例:

SELECT substr('abc1', 3, 3) col1, substrb('abc1', 3, 3) col1 FROM dual;

clip_image014

注意:当遇到位置或长度位于中文字节中(不完全包括)时,将以空格字符填充。

 

11)  replace

语法:replace(p_string, p_substring, p_new_substring)

参数:

p_string: 需要替换的源字符串;

p_substring: 被替换的子字符串;

p_new_substring: 替换的子字符串。

解释:在源字符串中,根据指定的子字符串,替换为另一个子字符串,返回被替换后的字符串。

示例:

SELECT replace('hello world', 'world', 'abeam') col1, replace('hello world', 'l', 'X') col2,replace('hello', '', '') col3, replace('', 'a', 'b') col4, replace(NULL, 'a', 'b') col5 FROM dual;

clip_image015

说明:如果源字符串中存在多个被替换的字符串,将全部替换掉;如果为找到匹配的字符串,则返回源字符串;如果源字符串为 NULL 或为空,则返回 NULL

 

12)  lpad

语法:lpad(p_string, p_padded_length [, p_pad_string])

参数:

p_string: 指定需要填充或截断的字符串;

p_padded_length: 指定被填充或截断的长度,如果小于原字符串长度则进行截断;

p_pad_string: 可选的。指定填充的字符串,默认为空格。

解释:填充或截断指定的字符串到指定长度。填充从左侧,截断则从右侧

示例:

SELECT lpad('hello', 2) col1, lpad('hello', 7) col2, lpad('hello', 7, '#') col3, lpad('hello', 7, '###') col4 FROM dual;

clip_image016

注意:

1.   当指定的 p_padded_length 不足字符串长度时,会进行截断到指定长度;

2.   当指定的 p_pad_string 字符追加到原字符后,超过指定长度时,也将会截断到指定长度。

3.   所以 lpad 函数还可以用于截断字符串的场景

 

13)  rpad

语法:lpad(p_string, p_padded_length [, p_pad_string])

参数:与 lpad 函数相同。

解释:填充或截断指定的字符串到指定长度。填充从右侧,截断也从右侧

示例:

SELECT rpad('hello', 2) col1, rpad('hello', 7) col2, rpad('hello', 7, '#') col3, rpad('hello', 7, '###') col4 FROM dual;

clip_image017

 

14)  instr

语法:instr(p_string, p_substring [, p_start_position [, p_occurrence]])

参数:

p_string: 要搜索的字符串;

p_substring: p_string 中搜索的子字符串;

p_start_position: 可选的。指定搜索的起始位置(包含该位置),默认为1;如果为负数,则从字符串末尾开始搜索,任然从头部计算位置。

p_occurrence: 可选的。表示搜索 p_substring 出现的第几次,默认为1

解释:返回字符串中子字符串的字符位置,未搜索到子字符串返回0注意,字符串起始位置为1

示例:

SELECT instr('hello', 'e') col1, instr('hel_lo', 'l', 4, 1) col2, instr('hello', 'l', -1) col3, instr('hello', 'a') col4 FROM dual;

clip_image018

 

15)  instrb

语法:instr(p_string, p_substring [, p_start_position [, p_occurrence]])

参数:与 instr 函数相同。

解释:返回字符串中子字符串的位于的字节位置,未搜索到子字符串返回0注意,字节起始位置为1

示例:

SELECT instr('你好,abeam', 'b') col1, instrb('你好,abeam', 'b') col2 FROM dual;

clip_image019

注意:因为在 ZHS16GBK 字符集中,一个英文占一个字节,而一个中文占两个字节,所以 b 的字节位置为8

 

16)  ltrim

语法:ltrim(p_string [, p_trim_string])

参数:

p_string: 指定需要移除的原字符串;

p_trim_string: 可选的。需要移除的子串,可以为多个字符,当为多个字符时,将逐一匹配,直到任意一个字符都不匹配时结束。未指定该参数时,默认为空格。

解释:从字符串左侧移除指定的子串,未指定子串时,默认移除前导空格

示例:

SELECT ltrim('  Abeam') col1, ltrim('000123', '0') col2, ltrim('101100abc', '10') col3, ltrim('2563b9', '12345') col4 FROM dual;

clip_image020

注意:会将子串中的每个字符进行匹配,直到所有字符都不匹配时结束。

 

17)  rtrim

语法:rtrim(p_string [, p_trim_string])

参数:与 ltrim 函数相同。

解释:从字符串右侧移除指定的子串,未指定子串时,默认移除尾随空格

示例:

SELECT rtrim('  Abeam  ') col1, rtrim('000123000', '0') col2, rtrim('101100abc101100', '10') col3, rtrim('2563b9625', '12345') col4 FROM dual;

clip_image021

 

18)  trim

语法:trim([[ LEADING | TRAILING | BOTH ] p_trim_character FROM] p_string)

参数:

LEADING: 表示将从左侧移除子串;

TRAILING: 表示将从右侧移除子串;

BOTH: 表示从两侧移除子串;

p_trim_character: 需要移除的子串,可以为多个字符,当为多个字符时,将逐一匹配,直到任意一个字符都不匹配时结束。未指定该参数时,默认为空格。

解释:从字符串的左侧、右侧或者两侧移除指定的子串,未指定子串时,默认移除两侧空格

示例:

SELECT trim('  Abeam  ') col1, trim(leading '0' from '00Abeam00') col2, trim(trailing '0' from '00Abeam00') col3, trim(both '0' from '00Abeam00') col4 FROM dual;

clip_image022

注意: ltrim rtrim 相比,trim 中的子串只能指定一个字符,否则会报错:

clip_image023

 

u  字符串函数综合示例

1.   使用 lengthconcatsubstrupperlower 函数实现 initcap 函数相同功能(首字母转大写,当然只处理第一个单词,第二个单词就爱莫能助了哈)

SELECT ename, initcap(ename) ename1, (CASE WHEN length(ename) > 1 THEN concat(upper(substr(ename, 1, 1)), lower(substr(ename, 2))) ELSE ename END) ename2 FROM emp;

clip_image024

是不是发现 initcap 函数还是蛮有用的?几个函数加起来才能实现它的功能。

 

2.   数值函数

1)   ceil

解释:返回大于或等于指定数字的最小整数

示例:

SELECT ceil(12.456) col1, ceil(12) col2, ceil(-12.5) col3 FROM dual;

clip_image025

 

2)   floot

解释:返回小于或等于指定数字的最大整数

示例:

SELECT floor(12.456) col1, floor(12) col2, floor(-12.5) col3 FROM dual;

clip_image026

 

3)   mod

解释:返回一个数除以另一个数的余数

示例:

SELECT mod(5, 3) col1, mod(9, 4) col2 FROM dual;

clip_image027

 

4)   power

解释:返回一个数的 N 次方根。

示例:

SELECT power(2, 3) col1, power(2, 10) col2 FROM dual;

clip_image028

 

5)   round

解释:四舍五入到指定的小数位,未指定小数位时默认取整数。

示例:

SELECT round(25.4) col1, round(25.5) col2, round(22.345, 2) col3round(140, -2) col4, round(150, -2) col5 FROM dual;

clip_image029

注意:指定小数位为负数时,将对整数位进行四舍五入

 

6)   trunc

语法:trunc(number [, decimal_places])

参数:

number: 要截断的数字;

decimal_places: 可选的。要截断的小数位数,该值必须是整数。如果省略此参数,则 TRUNC 函数会将数字截断为0个小数位。

解释:将一个数字截取到指定的小数位,未指定小数位时默认取整数。

示例1

SELECT trunc(25.4) col1, trunc(25.5) col2, trunc(22.345, 2) col3trunc(140, -2) col4, trunc(150, -2) col5 FROM dual;

clip_image030

注意:指定小数位为负数时,将对整数位进行进行截取

 

示例2

另外,trunc() 函数还可以用于截取日期,例如:

SELECT sysdate, trunc(SYSDATE, 'yyyy') col1 FROM dual;

clip_image031

 

7)   sign

解释:判断一个数字为正数还是负数,当大于0返回1,小于0返回-1,等于0则返回0

示例:

SELECT sign(1) col1, sign(-1) col2, sign(0) col3, sign(0.1) col4, sign(-0.1) col5 FROM dual;

clip_image032

 

8)   exp

解释:返回一个数字 e n 次方根,e=2.7182818

示例:

SELECT exp(2) col1, exp(3) col2 FROM dual;

clip_image033

 

3.   日期函数

1)   sysdate

解释:获取系统的当前时间。

示例:

SELECT sysdate col1, '马上快跨年了' col2 FROM dual;

clip_image034

 

2)   systimestamp

解释:获取系统的当前时间(毫秒)/时间戳。

示例:

SELECT systimestamp col1, '恩,还有一个小时' col2 FROM dual;

clip_image035

 

3)   add_months

解释:对指定的日期增加或减去月份,为负数时则为减。

示例:

SELECT ename, hiredate, add_months(hiredate, 12) col2, add_months(hiredate, -12) col3 FROM emp;

clip_image036

 

4)   last_day

解释:返回指定日期当月的最后一天的日期。

示例:

SELECT ename, hiredate, last_day(hiredate) col1 FROM emp;

clip_image037

 

5)   months_between

解释:返回两个日期相隔的月份

示例:

SELECT months_between(date'2019-12-31', date'2019-12-1') col1, months_between(date'2019-12-31', date'2019-11-30') col2, months_between(date'2019-12-31', date'2019-11-25') col3, months_between(date'2019-12-31', date'2020-12-31') col4, months_between(date'2019-12-31', date'2019-12-31') col5 FROM dual;

clip_image038

 

6)   next_days

解释:返回指定日期之后的指定星期X的日期。

示例:

SELECT next_day(date'2019-12-15', '星期一') col1, next_day(date'2019-12-15', '星期三') col2, next_day(date'2019-12-15', '星期六') col3, next_day(date'2019-12-15', '星期日') col4 FROM dual;

clip_image039

clip_image040

 

4.   转换函数

1)   to_char

语法:to_char(p_value [,p_format])

参数:

p_value: 指定需要转换的值;

p_format: 可选的。指定转换的格式,如下:

格式

描述

格式

描述

9

显示数字,并忽略前面0

yy

两位数字的年份,如:2019 -> 19

0

显示数字,如果位数不足,则用0补齐

yyyy

四位数字的年份,如:2019

.

在指定位置显示小数点

mm

两位数字的月份,如:12

,

在指定位置显示逗号

dd

两位数字的天,如:31

$

在数字前加美元

hh24

小时(24小时制),如:22

L

在数字前加本地货币符号

hh12

小时(12小时制),如:10

G

在指定位置显示分组符号

mi

分钟,如:36

D

在指定位置显示小数点符号(.)

ss

秒,如:52

 

 

ff1~6

毫秒:如:256

解释:将某种数据类型[以指定的格式]转为字符串类型。

示例1

SELECT sal, to_char(sal) col1, ltrim(to_char(sal, 'L99G999D99')) col2, hiredate, to_char(hiredate, 'yyyy-mm-dd hh24:mi:ss') col3, to_char(hiredate, 'yyyy') col4, to_char(hiredate, 'mm') col5, to_char(hiredate, 'dd') col6 FROM emp;

clip_image042

 

示例2

SELECT systimestamp, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ss ff3') col1, to_char(systimestamp, 'ff2') col2 FROM dual;

clip_image044

 

2)   to_date

语法:to_date(p_value, p_format)

参数:

p_value: 指定需要转换的值;

p_format: 指定转换格式,如下:

格式

描述

yyyy-mm-dd

转为年--日格式

yyyy-mm-dd hh24 | 12:mi:ss

转为年--日 时::秒格式

解释:将指定的字符串,以指定的格式转为日期类型。

示例:

SELECT to_date('2019-12-29', 'yyyy-mm-dd') Col1, to_date('2019-12-29 22:15:36', 'yyyy-mm-dd hh24:mi:ss') Col2, to_date('2019-12-29 10:15:36', 'yyyy-mm-dd hh12:mi:ss') Col3 FROM dual;

clip_image045

注意:

1.   当小时格式指定为12小时制时,字符串中的小时部分必须在1~12之间;

2.   to_date 函数不支持带有毫秒的日期字符串转换。

 

3)   to_timestamp

语法:(p_string [, format_mask] ['nlsparam'])

参数:

p_string: 将转换为时间戳的字符串。

format_mask: 可选的。这是将 p_string 转换为时间戳的格式。

解释:将字符串转换为时间戳。

示例:

SELECT to_timestamp('2019-12-29 10:15:36.12345', 'yyyy-mm-dd hh24:mi:ss.ff') Col1, to_timestamp('2019-12-29 10:15:36 999', 'yyyy-mm-dd hh24:mi:ss ff3') Col2 FROM dual;

clip_image047

 

4)   to_number

解释:将指定的字符串转为数字。

示例:

SELECT to_number('356') col1, to_number('-356') col2, to_number('35.6') col3, to_number('0.6') col4, to_number(NULL) col5 FROM dual;

clip_image048

注意:当转换失败时将报错。

 

5)   decode

语法:decode(条件,值1,返回值1,值2,返回值2...n,返回值n,缺省值)

解释:该函数类似于编程中 switch 语句的功能。根据指定的值,检索匹配的项,并返回该项对应的值。未匹配到对应的项时,则返回缺省值,不指定缺省值默认为 NULL

示例:

SELECT ename, deptno, decode(deptno, 10, '10号部门', 20, '20号部门', 30, '30号部门') col1, decode(ename, 'SMITH', '史密斯', '未知') col2, decode(NULL, 10, '10') col3 FROM emp;

clip_image049

未匹配到项时,则返回缺省值。

 

5.   NULL 函数

1)   nvl

语法:nvl(exp1, exp2)

解释:判断第一个表达式是否为 NULL,当 exp1 不为 NULL 时,返回 exp1;当 exp1 NULL 时返回 exp2exp2 可以为 NULL,否则必须与 exp1 的数据类型一致(或者可以隐式)

示例:

SELECT ename, comm, nvl(comm, 101) col1, nvl(comm, '101') col2, nvl(comm, NULL) col3 FROM emp;

clip_image050

 

2)   nvl2

语法:nvl2(exp1, exp2, exp3)

解释:判断第一个表达式是否为 NULL,当 exp1 不为 NULL 时,返回 exp2(与 nvl 区别1;当 exp1 表达式为 NULL 时,返回 exp3exp1, exp2, exp3 的数据类型不需要一致(与 nvl 区别2

示例:

SELECT ename, comm, nvl2(comm, 101, 201) col1, nvl2(comm, comm, 101) col2, nvl2(comm, '非空', sysdate) col3 FROM emp;

clip_image051

可见,其实 nvl2 可以完全取代 nvl,例如:nvl2(comm, comm, 101)

 

3)   coalesce

语法:coalesce(exp1, exp2, exp3 […, expn])

解释:从左往右返回第一个为非 NULL 的值。注意:所有指定的值必须为同一个数据类型,就算支持隐式转换都不可以。

示例:

SELECT coalesce(NULL, 0, 1, 2) col1, coalesce(1, NULL, 0, 2) col2 FROM dual;

clip_image052

 

其实 coalesce 也可以取代 nvl,例如:

SELECT ename, comm, coalesce(comm, 101) col1, coalesce(comm, NULL) col2 FROM emp;

clip_image053

区别在于,nvl 支持类型的隐式转换,而 coalesce 支持。

 

n  看了这几个函数,是不是有点晕,所有这里做个总结

函数

参数个数

exp1 is not null

exp1 is null

参数列表类型

nvl

2

exp1

exp2

支持隐式转换

nvl2

3

exp2

exp3

不需要一致

coalesce

不限制

exp1

exp2

不支持隐式转换

 

4)   nullif

语法:nullif(exp1, exp2)

解释:判断两个表达式的值是否相等,相等则返回 NULL,否则返回 exp1

示例:

SELECT nullif('ab', 'ab') col1, nullif('ab', NULL) col2, nullif('ab', 'aB') col3 FROM dual;

clip_image054

 

注意:nullif 中的 exp1 不能显示指定为 NULL(如:nullif(NULL, 'abc'))exp2 可以为 NULL。但是在判断字段时(字段中可以包含有 NULL 的值)可以,例如:

SELECT comm, nullif(comm, NULL) col1 FROM emp;

clip_image055

 

6.   聚合函数

1)   count

解释:返回统计的数量,可以指定 DISTINCT ALL 参数,默认为 ALL 选项。

示例:

SELECT count(deptno) col1, count(all deptno) col2, count(distinct deptno) col2  FROM emp;

clip_image056

 

2)   max

解释:返回值列表中的最大值,可以指定 DISTINCT ALL 参数,默认为 ALL 选项。

示例:

SELECT max(sal) col1, max(all sal) col2, max(distinct sal) col3 FROM emp;

clip_image057

提示:distinct all 参数在 max 中并没有实际的意义。

 

3)   min

解释:返回值列表中的最小值,可以指定 DISTINCT ALL 参数,默认为 ALL 选项。

示例:

SELECT min(sal) col1, min(all sal) col2, min(distinct sal) col3 FROM emp;

clip_image058

提示:distinct all 参数在 min 中并没有实际的意义。

 

4)   sum

解释:对值列表中的所有值进行求和,可以指定 DISTINCT ALL 参数,默认为 ALL 选项。

示例:

SELECT sum(sal) col1, sum(all sal) col2, sum(distinct sal) col3 FROM emp;

clip_image059

 

5)   avg

解释:返回值列表中的平均值,可以指定 DISTINCT ALL 参数,默认为 ALL 选项。

示例:

SELECT avg(sal) col1, avg(all sal) col2, avg(distinct sal) col3 FROM emp;

clip_image060

 

7.   系统函数

1)   uid

解释:返回当前用户的唯一整数。

示例:

SELECT uid FROM dual;

clip_image061

sys system 用户下可以也可查看到:

select user_id, username from dba_users;

clip_image062

 

2)   user

解释:返回当前用户的用户名。

示例:

SELECT user FROM dual;

clip_image063

 

3)   sys_context

语法:sys_context(p_namespace, p_parameter)

参数:

p_parameter:

参数

描述

terminal

当前会话客户所对应的终端标识符

language

返回数据库编码字符集

db_name

当前会话的数据库实例名

nls_date_format

当前会话的数据库日期格式

sessionid

返回当前会话ID

session_userid

返回当前会话的用户ID

session_user

当前会话的用户名

current_schema

当前会话所对应的默认方案名

host

数据库所在的主机名

ip_address

获取IP地址?

还有些其他参数,这里就不在列举了。

解释:sys_context 是一个 Oracle 数据库的综合函数,用于获取数据库相关信息,比如:数据库字符集、实例名等。

示例:

SELECT

sys_context('userenv', 'terminal') col1,

sys_context('userenv', 'language') col1,

sys_context('userenv', 'db_name') col3,

sys_context('userenv', 'nls_date_format') col4,   

sys_context('userenv', 'sessionid') col5,

sys_context('userenv', 'session_userid') col6,

sys_context('userenv', 'session_user') col7,

sys_context('userenv', 'current_schema') col8,

sys_context('userenv', 'host') col9,

sys_context('userenv', 'ip_address') col10 FROM dual;

clip_image065

clip_image066

 

8.   其他函数

1)   greatest

语法:greatest(expr_1, expr_2, ...expr_n)

解释:返回一组表达式中的最大值,以第一个表达式的数据类型为标准。当其他表达式与第一个表达式的类型,隐式转换失败时则报错。

示例:

SELECT greatest(2, 5, 3) colo1, greatest(2, '5', 3) col2, greatest('b', 'B', 'a') col3, greatest('b', 'cB', 'a') col4, greatest(date'2019-12-05', date'2019-12-06', date'2019-11-06') col5, greatest('', '', '') col6, greatest(NULL, 'a', 'b') col7 FROM dual;

clip_image067

说明:

1.   greatest(2, '5', 3) 将会对 "5" 隐式转为数字类型,转换失败时则报错;

2.   greatest('b', 'cB', 'a') 将抽取首字母进行比较。

3.   greatest(NULL, 'a', 'b') 当第一个表达式为 NULL 时,始终返回 NULL

 

注意:在比较字符的过程中,是先将字符转为 ascii 码,再取 ascii 码最大的字符。为验证这一点,我们查看以上字符的 ascii 码:

SELECT ascii('a') "a", ascii('b') "b", ascii('c') "c", ascii('B') B, ascii('') , ascii('') , ascii('') FROM dual;

clip_image068

 

2)   least

语法:least(expr_1, expr_2, ...expr_n)

解释:greatest 函数相同,但 least 函数是返回一组表达式中的最小值

示例:

SELECT least(2, 5, 3) colo1, least(2, '5', 3) col2, least('b', 'B', 'a') col3, least('b', 'cB', 'a') col4, least(date'2019-12-05', date'2019-12-06', date'2019-11-06') col5, least('', '', '') col6, least(NULL, 'a', 'b') col7 FROM dual;

clip_image069

 

3)   dump

dump() 函数可以获取一个值的相关信息,比如:数据类型代码、字节长度和表达式的内部表示形式等。

语法:dump(expression [, return_format] [, start_position] [, length])

参数:

expression:要分析的表达式;

return_format:可选的。决定了返回值的格式,该参数可以是以下任何值:

l  8 :八进制符号

l  10 :十进制符号(默认值)

l  16 :十六进制符号

l  17 :单个字符

l  1008 :带字符集名称的八进制符号

l  1010 :带字符集名称的十进制符号

l  1016 :带字符集名称的十六进制符号

l  1017 :带字符集名称的单个字符

start_position :可选的,要返回的内部表示的起始位置;

length :可选的,要返回的内部表示的长度。

示例:

SELECT dump('abc') col3, dump(123) col2, dump(sysdate) col3 FROM dual;

clip_image071

Typ 表示该值的数据类型;Len 表示占用的字节长度;": xx,xx" 表示内部存储的字节数值。

posted @ 2020-01-19 16:30  Abeam  阅读(1463)  评论(0编辑  收藏  举报