1. 拼接字符串函数concat(str1,str2)
- 功能:拼接两个字符串
- 参数:str1,str2 字符串(数值会自动转换),只能有2个参数
- 返回:str1和str2拼接在一起的字符串
SQL和执行结果:
SELECT CONCAT(123, 'abc'),
CONCAT('abc', 'def'),
123 || 'ghi' || 'jkl' || 'mno'
FROM dual;
类似的:还可以用
||
连接字符串,concat(str1,str2)
和str1||str2
都能拼接字符串
不同的是,concat()
函数只能拼接2个字符串,||
可以连接多个字符串
2. 查找字符串位置instr(str1,str2[,pos][,nth])
- 功能:在str1中查找str2的位置
- 参数:
str1,str2 字符串,
pos:数值型参数,表示从第pos个字符的位置开始查找,默认值为1,表示从第1个字符开始查找
nth:数值型参数,表示第nth次出现,默认值为1,表示第1次出现str2- 返回:按条件查找到的str2在str1中的位置,即str2从str1的第几位开始(汉字算作1个字符),若找不到则返回0
SQL和执行结果:
SELECT INSTR('一二三abc123abcabc', 'bc'),
INSTR('一二三abc123abcabc', 'bc', 6),
INSTR('一二三abc123abcabc', 'bc', 6, 2),
INSTR('一二三abc123abcabc', 'bc', 6, 3)
FROM dual;
类似的函数有instrb(str1,str2[,pos][,nth]),区别在于汉字/全角字符算2个字符
3. 计算字符串长度length(str1)
- 功能:计算字符串str1的长度
- 参数:str1 字符串
- 返回:字符串str1的长度,汉字算作1个字符
SQL和执行结果:
SELECT LENGTH('一二三123abc') FROM dual;
类似的函数有lengthb(str1),汉字/全角字符算2个字符
其他如lengthc(),length2(),length4()较少使用
4. 字符补到指定长度
4.1 左侧补位函数lpad(str1,len[,pad])
- 功能:在str1左侧用pad字符补位到整个字符串长度为len
- 参数:str1 字符串,len 数值,pad 字符串
- 返回:在str1基础上,用pad补位到len长度的字符串
4.2 右侧补位函数rpad(str1,len[,pad])
- 功能:在str1右侧用pad字符补位到整个字符串长度为len
- 参数:str1 字符串,len 数值,pad 字符串(不填默认用空格填充)
- 返回:在str1基础上,用pad补位到len长度的字符串
SQL和执行结果:
SELECT LPAD(123, 10),
LPAD(123, 10, ' '),
LPAD(123, 10, '0'),
LPAD('abc', 10, 'x'),
LPAD('abc', 10, 'xy')
FROM dual
UNION
SELECT RPAD(123, 10),
RPAD(123, 10, ' '),
RPAD(123, 10, '0'),
RPAD('abc', 10, 'x'),
RPAD('abc', 10, 'xy')
FROM dual;
5. 删除字符
5.1 删除左侧字符串ltrim(str1[,tset])
- 功能:从str1左侧第一位开始删除tset字符,直到遇到第一个非tset字符
- 参数:str1 字符串,tset 字符串(不写则默认为空格)
- 返回:在str1基础上,删除左侧tset字符后的字符串
- 过程:以tset字符串的每一个字符为一个外循环,以str1的每一个字符为内循环,从str1左侧开始匹配,当前循环的字符相同则从str1中删除该字符,否则跳出当前循环
SQL和执行结果:
SELECT LTRIM(' ffff7777ebd'),
LTRIM(' ffff7777ebd', ' '),
LTRIM(' ffff7777ebd', ' ebd'),
LTRIM(' ffff7777ebd', ' f'),
LTRIM(' ffff7777ebd', ' f7'),
LTRIM(' ffff7777ebd', ' f7ebd')
FROM dual;
5.2 删除右侧字符rtrim(str1[,tset])
- 功能:从str1右侧第一位开始删除tset字符,直到遇到第一个非tset字符
- 参数:str1 字符串,tset 字符串
- 返回:在str1基础上,删除右侧tset字符后的字符串
- 过程:以tset字符串的每一个字符为一个外循环,以str1的每一个字符为内循环,从str1右侧开始匹配,当前循环的字符相同则从str1中删除该字符,否则跳出当前循环
SQL和执行结果:
SELECT RTRIM('ffff7777ddd '),
RTRIM('ffff7777ddd ', ' '),
RTRIM('ffff7777ddd ', ' f'),
RTRIM('ffff7777ddd ', ' d'),
RTRIM('ffff7777ddd ', ' d7'),
RTRIM('ffff7777ddd ', ' d7f')
FROM dual;
5.3 删除两侧字符trim(c1 from str2)
- 功能:从str2字符串两侧同时删除c1字符
- 参数:
c1 字符串型,只能1位长度,可以是空格或任意字符,汉字算1个字符,默认为空格
str2 字符串型,任意字符串- 返回:在str2基础上,删除两侧c1字符后的字符串
SQL和执行结果:
SELECT TRIM(' fff 777 ddd '),
TRIM(' ' FROM ' fff 777 ddd '),
TRIM('f' FROM 'fff777ddd'),
TRIM('7' FROM 'fff777ddd'),
TRIM('南' FROM '南京南站南')
FROM dual;
6. 替换字符串replace(src-str,old-str[,new-str])
- 功能:在src-str字符串中,用new-str替换old-str,如无new-str,则直接删除old-str
- 参数:
src-str 字符串型,原字符串,
old-str 字符串型,希望替换掉的字符串
new-str 字符串型,用来替换old-str,如无new-str,则直接删除old-str- 返回:在src-str中,用new-str替换old-str后的字符串
SQL和执行结果:
select replace('南京南站南','南') , replace('南京南站南','南','北'),replace('南京南站南','南京','北京') from dual;
7. 截取字符串substr(str,pos[,len])
- 功能:在str字符串中,从pos位置开始截取字符串(汉字/全角字符,算1个字符),
- 参数:
str 字符串型,截取前的字符串,
pos 数值型,从左侧第pos位开始截取字符串,如果为小数则截取整数部分,如果为负数则从右侧开始计数
len 数值型,可选参数,表示截取长度为len的字符串,不写则默认截取到str字符串末尾的所有字符。如果len的值≤0,则返回空白字符串- 返回:从str中第pos位开始截取的长度为len的字符串
SQL和执行结果:
SELECT SUBSTR('ab12南京南34cd', 5),
SUBSTR('ab12南京南34cd', -5),
SUBSTR('ab12南京南34cd', 2.2, 3),
SUBSTR('ab12南京南34cd', 3.8, 3),
SUBSTR('ab12南京南34cd', 2.2, 0),
SUBSTR('ab12南京南34cd', 3.8, -1)
FROM dual;
二进制截取字符串substrb(str,pos[,len])
功能和参数:和substr()函数一样
区别:汉字/全角字符算2个字符
8. 替换对应字符串translate(str,src,dest)
- 功能:把str字符串中,src字符串一一对应替换成dest字符串
- 参数:
str 字符串型,替换前的字符串
src 字符串型,替换掉的字符串src
dest 字符串型,用于替换src字符串的字符串- 返回:从str中第pos位开始截取的长度为len的字符串
- 说明:
- 如果src和dest字符串长度相同,则将src和dest所有字符依次一一对应的方式替换,
例如TRANSLATE('aabb', 'ab', 'AZ')
,把所有a对应替换为A,所有b对应替换为Z
特别的,如果出现重复字符并且对应不同内容,后出现的对应字符会被忽略,
例如TRANSLATE('1122', '112', '345')
,1对应3,第二个1对应4会被忽略,2对应5- 如果src比dest长,那么src中比dest长的字符,也就是在dest没有对应字符的内容,会被删除
例如TRANSLATE('南京南站', '南京站', '西安')
,src中的“站”在dest中没有对应字符,则src中的“站”会被删除- 如果src比dest短,则dest中多余的字符会被忽略
例如TRANSLATE('南京南站', '南京', '西安大略')
,src的“南京”,会被替换为dest的“西安”,dest的“大略”会被忽略
SQL和执行结果:
SELECT TRANSLATE('aabb', 'ab', 'AZ'),
TRANSLATE('1122', '112', '345'),
TRANSLATE('南京南站', '南京站', '西安'),
TRANSLATE('南京南站', '南京', '西安大略')
FROM dual;