Ø 简介
本文主要来梳理下 Oracle 中的常用的系统函数,掌握这些函数的使用,对于我们编写 SQL 语句或 PL/SQL 代码时很有帮助,所以这也是必须掌握的知识点。
在 Oracle 中或者其他数据库中都存在两大类函数:
Ø 第一类,单行函数,表现形式为对每一行中指定的数据进行计算或处理,并返回计算后的结果。例如:
SELECT REPLACE(ename, 'A', 'a') ename, t.* FROM emp t;
Ø 第二类,则是多行函数,表现形式为将多行的数据进行计算或处理,并返回计算后的结果,例如:
SELECT t.deptno, AVG(sal) avgsal FROM emp t GROUP BY deptno;
表示,将分组后的多行进行平均值计算,即多行计算函数。
本文主要包括以下函数介绍:
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;
2) lengthb
语法:lengthb(p_string)
解释:返回字符串的字节长度,如果 p_string 为 NULL 或为空,则返回 NULL。
示例:
SELECT lengthb('ab 中国') col1, lengthb(' ') Col2, lengthb('') Col3, lengthb(NULL) Col4 FROM dual;
说明: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;
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;
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;
通常情况下,我们连接字符串习惯用"||"连接符,而不是使用 cancat 函数,因为 cancat 函数同时只能连接两个字符串,而"||"连接符可以同时连接多个,例如:
SELECT (123 || 12.5 || sysdate || '很晚了') col1, concat('该睡觉了', '吗?') col2 FROM dual;
6) upper
语法:upper(p_string)
解释:将指定的字符串中的所有字母都转为大写。
示例:
SELECT upper('Hello woRld') col1, upper('中国') col2, upper(NULL) col3 FROM dual;
7) lower
语法:lower(p_string)
解释:将指定的字符串中的所有字母都转为小写。
示例:
SELECT lower('hEllo ABEAM') col1, lower('中国') col2, lower(NULL) col3 FROM dual;
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;
注意:如果第一个字符不是字母,将继续寻找下一个为字母的字符进行转换,直到遇到第一个为字母的字符。
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;
注意:
Ø p_start_position 为负数时,将从字符串末尾向开始计算起始位置,并向后开始取指定长度;
Ø p_length 为负数时,将返回 NULL。
10) substrb
语法:substrb(p_string, p_start_position [, p_length])
参数:与 substr 函数相同。
解释:从源字符串中提取子字符串,注意:substrb 是按字节位置和长度进行提取的,而不是字符。
示例:
SELECT substr('a爱b中c国1', 3, 3) col1, substrb('a爱b中c国1', 3, 3) col1 FROM dual;
注意:当遇到位置或长度位于中文字节中(不完全包括)时,将以空格字符填充。
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;
说明:如果源字符串中存在多个被替换的字符串,将全部替换掉;如果为找到匹配的字符串,则返回源字符串;如果源字符串为 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;
注意:
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;
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;
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;
注意:因为在 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;
注意:会将子串中的每个字符进行匹配,直到所有字符都不匹配时结束。
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;
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;
注意:与 ltrim 和 rtrim 相比,trim 中的子串只能指定一个字符,否则会报错:
u 字符串函数综合示例
1. 使用 length、concat、substr、upper、lower 函数实现 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;
是不是发现 initcap 函数还是蛮有用的?几个函数加起来才能实现它的功能。
2. 数值函数
1) ceil
解释:返回大于或等于指定数字的最小整数。
示例:
SELECT ceil(12.456) col1, ceil(12) col2, ceil(-12.5) col3 FROM dual;
2) floot
解释:返回小于或等于指定数字的最大整数。
示例:
SELECT floor(12.456) col1, floor(12) col2, floor(-12.5) col3 FROM dual;
3) mod
解释:返回一个数除以另一个数的余数。
示例:
SELECT mod(5, 3) col1, mod(9, 4) col2 FROM dual;
4) power
解释:返回一个数的 N 次方根。
示例:
SELECT power(2, 3) col1, power(2, 10) col2 FROM dual;
5) round
解释:四舍五入到指定的小数位,未指定小数位时默认取整数。
示例:
SELECT round(25.4) col1, round(25.5) col2, round(22.345, 2) col3, round(140, -2) col4, round(150, -2) col5 FROM dual;
注意:指定小数位为负数时,将对整数位进行四舍五入。
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) col3, trunc(140, -2) col4, trunc(150, -2) col5 FROM dual;
注意:指定小数位为负数时,将对整数位进行进行截取。
示例2:
另外,trunc() 函数还可以用于截取日期,例如:
SELECT sysdate, trunc(SYSDATE, 'yyyy') col1 FROM dual;
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;
8) exp
解释:返回一个数字 e 的 n 次方根,e=2.7182818。
示例:
SELECT exp(2) col1, exp(3) col2 FROM dual;
3. 日期函数
1) sysdate
解释:获取系统的当前时间。
示例:
SELECT sysdate col1, '马上快跨年了' col2 FROM dual;
2) systimestamp
解释:获取系统的当前时间(毫秒)/时间戳。
示例:
SELECT systimestamp col1, '恩,还有一个小时' col2 FROM dual;
3) add_months
解释:对指定的日期增加或减去月份,为负数时则为减。
示例:
SELECT ename, hiredate, add_months(hiredate, 12) col2, add_months(hiredate, -12) col3 FROM emp;
4) last_day
解释:返回指定日期当月的最后一天的日期。
示例:
SELECT ename, hiredate, last_day(hiredate) col1 FROM emp;
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;
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;
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;
示例2:
SELECT systimestamp, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ss ff3') col1, to_char(systimestamp, 'ff2') col2 FROM dual;
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;
注意:
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;
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;
注意:当转换失败时将报错。
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;
未匹配到项时,则返回缺省值。
5. NULL 函数
1) nvl
语法:nvl(exp1, exp2)
解释:判断第一个表达式是否为 NULL,当 exp1 不为 NULL 时,返回 exp1;当 exp1 为 NULL 时返回 exp2;exp2 可以为 NULL,否则必须与 exp1 的数据类型一致(或者可以隐式)。
示例:
SELECT ename, comm, nvl(comm, 101) col1, nvl(comm, '101') col2, nvl(comm, NULL) col3 FROM emp;
2) nvl2
语法:nvl2(exp1, exp2, exp3)
解释:判断第一个表达式是否为 NULL,当 exp1 不为 NULL 时,返回 exp2(与 nvl 区别1);当 exp1 表达式为 NULL 时,返回 exp3;exp1, exp2, exp3 的数据类型不需要一致(与 nvl 区别2)。
示例:
SELECT ename, comm, nvl2(comm, 101, 201) col1, nvl2(comm, comm, 101) col2, nvl2(comm, '非空', sysdate) col3 FROM emp;
可见,其实 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;
其实 coalesce 也可以取代 nvl,例如:
SELECT ename, comm, coalesce(comm, 101) col1, coalesce(comm, NULL) col2 FROM emp;
区别在于,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;
注意:nullif 中的 exp1 不能显示指定为 NULL(如:nullif(NULL, 'abc')),exp2 可以为 NULL。但是在判断字段时(字段中可以包含有 NULL 的值)可以,例如:
SELECT comm, nullif(comm, NULL) col1 FROM emp;
6. 聚合函数
1) count
解释:返回统计的数量,可以指定 DISTINCT 和 ALL 参数,默认为 ALL 选项。
示例:
SELECT count(deptno) col1, count(all deptno) col2, count(distinct deptno) col2 FROM emp;
2) max
解释:返回值列表中的最大值,可以指定 DISTINCT 和 ALL 参数,默认为 ALL 选项。
示例:
SELECT max(sal) col1, max(all sal) col2, max(distinct sal) col3 FROM emp;
提示:distinct 和 all 参数在 max 中并没有实际的意义。
3) min
解释:返回值列表中的最小值,可以指定 DISTINCT 和 ALL 参数,默认为 ALL 选项。
示例:
SELECT min(sal) col1, min(all sal) col2, min(distinct sal) col3 FROM emp;
提示:distinct 和 all 参数在 min 中并没有实际的意义。
4) sum
解释:对值列表中的所有值进行求和,可以指定 DISTINCT 和 ALL 参数,默认为 ALL 选项。
示例:
SELECT sum(sal) col1, sum(all sal) col2, sum(distinct sal) col3 FROM emp;
5) avg
解释:返回值列表中的平均值,可以指定 DISTINCT 和 ALL 参数,默认为 ALL 选项。
示例:
SELECT avg(sal) col1, avg(all sal) col2, avg(distinct sal) col3 FROM emp;
7. 系统函数
1) uid
解释:返回当前用户的唯一整数。
示例:
SELECT uid FROM dual;
在 sys 或 system 用户下可以也可查看到:
select user_id, username from dba_users;
2) user
解释:返回当前用户的用户名。
示例:
SELECT user FROM dual;
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;
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;
说明:
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;
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;
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;
Typ 表示该值的数据类型;Len 表示占用的字节长度;": xx,xx" 表示内部存储的字节数值。