(五)单行函数

1.字符函数

函数 说明
ASCII 返回对应字符的十进制值
CHR 给出十进制返回字符
CONCAT 拼接两个字符串,与
INITCAT 将字符串的第一个字母变为大写
INSTR 找出某个字符串的位置
INSTRB 找出某个字符串的位置和字节数
LENGTH 以字符给出字符串的长度
LENGTHB 以字节给出字符串的长度
LOWER 将字符串变为小写
LPAD 使用指定的字符在字符的左边填充
LTRIM 在左边裁剪掉指定的字符
RPAD 使用指定的字符在字符的右边填充
RTRIM 在右边裁剪掉指定的字符
REPLACE 执行字符串搜索和替换
SUBSTR 取字符串的子串
SUBSTRB 取字符串的子串(以字节)
SOUNDEX 返回一个同音字符串
TRANSLATE 执行字符串搜索和替换
TRIM 裁剪掉前面或后面的字符串
UPPER 将字符串变为大写

常用字符函数讲解:

(1)取长度函数

length(string)

语句:

select length('ABCD') from dual;

(2)截取函数

substr(string,start, len)
string 表示源字符串,即要截取的字符串,
start 开始位置,从1开始查找。如果start是负数,则从string字符串末尾开始算起
len 表示截取字符串长度

select substr('Hello SQL!', 1) from dual;     --截取所有字符串,返回'Hello SQL!'
select substr('Hello SQL!', 2) from dual;   --从第2个字符开始,截取到末尾。返回'ello SQL!'
select substr('Hello SQL!', -4) from dual;    --从倒数第4个字符开始,截取到末尾。返回'SQL!'
select substr('Hello SQL!', 3, 6) from dual;  --从第3个字符开始,截取6个字符。返回'llo SQ'
select substr('Hello SQL!', -4, 3) from dual; --从倒数第4个字符开始,截取3个字符。返回'SQL'

(3)去除开头或者结尾的字符串

trim

ltrim

rtrim

select trim('S' from 'SXXS') from dual;    --去除首尾字符串
select trim ( '  sxsx  ' ) from dual;      --去除首尾空格
select ltrim ( '  sxsx  ' ) from dual;     --去除开头空格
select rtrim( ' sxsx   ' ) from dual;      --去除结尾空格
select ltrim('SSSXXS' , 'S') from dual;    --去除开头空格
select Rtrim('SSSXXX' , 'X') from dual;    --去除结尾空格

(4)替换函数
replace(源字符串,要被替换的字符串,要替换成的字符串)
translate (源字符串,要被替换的字符串,要替换成的字符串)

select replace('(1996)',')', '--') from dual;   --将')'替换成'--'
select translate('(1996)',')', '--') from dual; --将')'替换成'-'
select translate('(1996)','()', '--') from dual; -- 将'('替换成'-',将')'替换成'-'
select replace('(1996)','()','--') from dual;  -- 将'()'替换成'--'

replace 和 translate 都是替换,只不过,translate 是逐一替换对应的字符串,而replace则是寻找并替换整个字符串

(5)填充函数

lpad (s,len,char)

rpad(s,len,char)

s: 是要填充的字符串

len: 是填充后字符串的长度

char: 是用于填充的字符

如果 s 的长度小于 len,则在左侧填充 char 直到长度达到 len。如果 s 的长度已经大于等于 len,则返回原字符串 s。注意中文s和char位置若为中文,则一个中文占两个长度

select rpad('s',4,'*') from dual;
*select rpad('中',4,'*') from dual
select rpad('中',4,'国') from dual;

(6)字符查找函数

instr(string,child_string,start,show_time)

string:表示源字符串
child_string:子字符串,即要查找的字符串
start:可选项,开始位置,默认从1开始。如果为负数,则从右向左检索
show_time:可选项,表示子字符串第几次出现在源字符串当中,默认第1次,负数则报错

select INSTR('city_company_staff', '_') from dual    --返回5
--表示从源字符串'city_company_staff'中第1个字符开始查找子字符串'_'第1次出现的位置

select INSTR('city_company_staff', '_', 5) from dual    --返回5
--表示从源字符串'city_company_staff'中第5个字符开始查找子字符串'_'第1次出现的位置

  select INSTR('city_company_staff', '_', 5, 1) from dual    --返回5
--表示从源字符串'city_company_staff'中第5个字符开始查找子字符串'_'第1次出现的位置

  select INSTR('city_company_staff', '_', 3, 2) from dual    --返回13
--表示从源字符串'city_company_staff'中第3个字符开始查找子字符串'_'第2次出现的位置

  select INSTR('city_company_staff', '_', -1, 1) from dual    --返回13
-- start参数为-1,从右向左检索,查找'_'字符串在源字符串中第1次出现的位置

  select INSTR('city_company_staff', '_', -6, 2) from dual    --返回5
--start参数为-6,从右向左检索,查找'_'字符串在源字符串中第2次出现的位置

(7)连接函数

concat (string1,string2)

select concat('hello ','word!') from dual

(8)取ASCII码

ASCII(string)

select ascii('A') from dual

(9)大小写转换函数

upper(string)

lower(string)

initcap(string)

select upper('app ss') from  dual
select initcap('app ss') from  dual  -- 将每个字母的首字母大写
select lower('APP SS') from  dual

2.数值函数

函数 说明
ABS 绝对值
CEIL 向上取整
FLOOR 向下取整
MOD 求余
POWER(X,Y) X的Y次幂
ROUND 按照精度四舍五入
SQRT 求平方根
TRUNC 按照精度截取

常见数值函数讲解:

(1)四舍五入

ROUND(n,i)

  • 四舍五入
  • n是任意数值,是必需的。i是整数,是可选的,忽略则默认为0
  • 若i为0,则取整数位四舍五入;若 i < 0, 则对n四舍五入取整到小数点左侧第i位;若 i > 0, 则对n四舍五入取整到小数点右侧第i位

select round(3.141592653) from dual
select round(3.141592653 , 0) from dual
select round(3.141592653 , -2) from dual
select round(53.141592653 , -2) from dual
select round(35.41592653 , -1) from dual
select round(3.141592653 , 4) from dual
select round(-5.6) from dual

(2)截断函数

TRUNC(n,i)

n是任意数值,是必需的。i是整数,是可选的,忽略则默认为0

select trunc(3.141592653) from dual
select trunc(3.141592653 , 0) from dual
select trunc(3.141592653 , -2) from dual
select trunc(53.141592653 , -2) from dual
select trunc(35.41592653 , -1) from dual
select trunc(3.141592653 , 4) from dual
select trunc(-5.6) from dual

(3)向上取整

ceil(n)

select ceil(3.1415926) from dual

(4)向下取整

floor(n)

select floor(3.1415926) from dual

(5)求余函数

mod(n1 , n2)

select  mod(9 , 3) from dual

(6)平方根函数

sqrt(n)

select sqrt(121) from dual

(7)幂函数

power(x,y) ,求 x 的 y 次幂

select power(11,2) from dual
select power(8 , 1/3) from dual

3.日期函数

函数 说明
ADD_MONTHS 在日期 date 上增加 count 个月
GREATEST(date1,date2,. . .) 从日期列表中选出最晚的日期
LAST_DAY( date ) 返回日期 date 所在月的最后一天
LEAST( date1, date2, . . .) 从日期列表中选出最早的日期
MONTHS_BETWEEN(date2,date1) 给出 Date2 - date1 的月数(可以是小数)
NEXT_DAY( date,’day’) 给出日期 date 之后下一天的日期,这里的 day 为星期
SQRT 求平方根
TRUNC 按照精度截取
NEW_TIME(date,this,other) 给出在 this 时区=Other 时区的日期和时间
ROUND(date,format) 未指定 format 时,如果日期中的时间在中午之前,则将日期中的时间截断为 12 A.M.(午夜,一天的开始),否则进到第二天。时间截断为 12 A.M.(午夜,一天的开始),否则进到第二天
TRUNC(date,format) 未指定 format 时,将日期截为 12 A.M.( 午夜,一天的 开始)

常用日期函数讲解:

(1)我们用 sysdate 这个系统变量来获取当前日期和时间

select sysdate from dual  -- 系统的当前时间
select systimestamp  from dual -- 可以得到系统的当前时间,该时间包含时区信息,精确到微秒
select dbtimezone  from dual  -- 返回数据库时区

(2)加月函数

add_months(r,n)

r是指定日期,n是要增加的月份数,如果n为负数,则表示减去的月份数

如果指定的日期是月份的最后一天,返回的也是新的月份的最后一天,如果新的月份比指定的月份日期少,将会自动调回有效日期

select to_char(add_months(to_date('2018-11-12', 'yyyy-mm-dd'), 1),
'yyyy-mm-dd'),
to_char(add_months(to_date('2018-10-31', 'yyyy-mm-dd'), 1),
  'yyyy-mm-dd'),
to_char(add_months(to_date('2018-09-30', 'yyyy-mm-dd'), 1),
  'yyyy-mm-dd')
from dual

(3)月份最后一天

last_day(r)

select last_day(sysdate) from dual

(4)两个日期间相差的月份数

months_between(r1,r2)

函数返回r1日期和r2日期直接的月份。当r1>r2时,返回的是正数,假如r1和r2是不同月的同一天,则返回的是整数,否则返回的小数。当r1<r2时,返回的是负数

select months_between(to_date('2018-11-12', 'yyyy-mm-dd'),
to_date('2017-11-12', 'yyyy-mm-dd')) as zs, -- 整数
months_between(to_date('2018-11-12', 'yyyy-mm-dd'),
  to_date('2017-10-11', 'yyyy-mm-dd')) as xs, -- 小数
months_between(to_date('2017-11-12', 'yyyy-mm-dd'),
  to_date('2018-10-12', 'yyyy-mm-dd')) as fs -- 负数
from dual

(5)日期四舍五入

round(r,f)

日期r按f的格式进行四舍五入。如果f不填,则四舍五入到最近的一天

select sysdate, -- 当前时间
round(sysdate, 'yyyy') as year, -- 按年
round(sysdate, 'mm') as month, -- 按月
round(sysdate, 'dd') as day, -- 按天
round(sysdate) as mr_day, -- 不填默认按天
round(sysdate, 'hh24') as hour -- 按小时
from dual

(6)日期截取

将日期r按f的格式进行截取。如果f不填,则截取到当前的日期

select sysdate, -- 当前时间
trunc(sysdate, 'yyyy') as year, -- 按年
trunc(sysdate, 'mm') as month, -- 按月
trunc(sysdate, 'dd') as day, -- 按天
trunc(sysdate) as mr_day, -- 不填默认按天
trunc(sysdate, 'hh24') as hour -- 按小时
from dual

4.转换函数

函数 说明
CHARTOROWID 将字符转换到 rowid 类型
CONVERT 转换一个字符节到另外一个字符节
HEXTORAW 转换十六进制到 raw 类型
RAWTOHEX 转换 raw 到十六进制
ROWIDTOCHAR 转换 ROWID 到字符
TO_CHAR 转换日期格式到字符串
TO_DATE 按照指定的格式将字符串转换到日期型
TO_NUMBER 将数字字串转换到数字
TO_MULTIBYTE 把单字节字符转换到多字节
TO_SINGLE_BYTE 转换多字节到单字

常用转换函数讲解:

(1)数字转字符串

select TO_CHAR(1024) from dual

(2)日期转字符串

select TO_CHAR(sysdate,'yyyy-mm-dd') from dual

(3)字符串转日期

select TO_DATE('2017-01-01','yyyy-mm-dd') from dual

(4)字符串转数字

select to_number('100') from dual

5.其他函数

(1)空值处理函数

nvl(string1,string2)

nvl函数的括号中可以填两个数据,数据的数据类型必须相同,如果第一个数据为空,则取第二个数据的值,第一个数据不为空,则取第一个数据的原值。

select NVL(NULL,0) from dual

nvl2(string1,string2,string3)

nvl2函数的括号中可以填三个数据,如果数据1为空,返回数据3的值,如果数据1不为空,返回数据2的值

nullif(string1,string2)

如果数据1和数据2相等的话,返回null,如果不相等,返回数据1

coalesce(string1,string2,string3,stringn)

作用是返回第一个不为null的数据,如果都为null,则返回null,本质上类似于nvl函数的循环使用

(2)decode 函数

decode(条件,值 1,翻译值 1,值 2,翻译值 2,…值 n,翻译值 n,缺省值)
根据条件返回相应值

select  decode ('hl','hh','le','el') from dual
作者:郭佳豪  创建时间:2023-10-18 09:53
最后编辑:郭佳豪  更新时间:2023-10-18 17:33