转载请注明出处:http://www.jb51.cc/article/p-qlmorafc-beo.html,谢谢!
1、概述
本文介绍String类型及相关的函数,基于当前最新的Oracle 12c 为基础作介绍。
下文将字符串简称为串。
Oracle函数的工作方式有两种:
1、根据旧的对象创建新的对象——他们对原来的信息进行修改,如改变字母的大小写。
2、告诉用户有关的信息,如一个单词或句子中有几个字符。
后续会更新另外两种处理文本的方式:Oracle中的正则表达式 和 Oracle Text工具,等文章编辑完成,会在此处添加链接。
Oracle中主要有两种字符串类型:CHAR和VARCHAR2,他们以字母,标点,数字和空格的混合形式存在。
CHAR串始终为定长的,如果设置的值长度小于CHAR列的串值,会自动填充空格。在比较CHAR串时,会为双方都补满空格后再进行比较。
VARCHAR2数据类型为边长的串(VARCHAR与VARCHAR2为同义词)。
2、字符串处理函数
2.1、总览
见下表:
2.2、连接符||及CONCAT函数
可以连接两个列名或者常量。
比如:
如果姓名为中文还好,但是如果是英文的,这样连接会导致读起来比较困难,所以可以在中间加上常量“空格”:
||' ' 使用CONCAT函数也能达到同样的效果:
SELECT CONCAT
(firstName,lastName) FROM USER 结果:
但是CONCAT函数符合ANSI sql标准,所以适合更多不同的数据库,||是Oracle专有的,使用起来更简洁。
2.3、格式统一:RPAD和LPAD
RPAD允许在列的右边填充一组字符,填充的字符可以为任何字符。LPAD从左边添加。
使用方式:
RPAD(string,length[,'set'])
LPAD(string,sans-serif; font-size:14px"> 这里的string是数据库中的字符串列或常量,length是填充后的长度,set是用来填充的字符串。如果方括号中的内容省略了,会默认使用空格填充。
RPAD的使用:
SELECT rpad
lastname10'_' as name from users LPAD的使用:
SELECT lpad
2.4、修剪:LTRIM,RTRIM,TRIM
LTRIM和RTRIM从串的左边或右边删除不需要的字符。
RTRIM(string[,sans-serif; font-size:14px"> LTRIM(string[,sans-serif; font-size:14px"> 如果没有设置要删除的值,默认删除空格。
还是用例子来解释,这里有一张存放书名的表,我们得到其书名列的值如下:
SELECT name FROM BOOK
这是因为录入数据的不是同一个人,导致了数据格式不一致,首先我们来试一下LTRIM函数:
SELECT LTRIM
name'《' FROM BOOK 可以看到左边已经统一了,接下来就是右边,我们很容易就能组合使用LTRIM和RTRIM:
SELECT RTRIM
LTRIM),'》';
可以看到,查询的结果已经统一了。可以一次删除多个字符,只需要把要删除的串设置进去即可。
我们在看一个例子,如果某个字段内容为:“the easy way”:
INSERT INTO BOOKIDNAME VALUES(6'the easy way');
我们试着删除前面的the和多余的空格,于是我们执行如下脚本:
select ltrim'the ' book where id = 结果:asy way
发现并不是我们想要的,以为LTRIM在删除我们指定的字符串时,查找的不是这个字符串,而是里面的一个个字符,只有在第一次发现不属于我们指定的字符串中的字符时才会退出。RTRIM和TRIM的原理也是一样的。为了达到上面的目的,我们可以这样做:
ltrim
'the'' ' 这样就会输出我们想要的结果。但是还有更为简单的方式就是使用INSTR、SUBTR和DECODE函数,这在后面的文章中会介绍。
当我们两边要删除的字符是相同的的时候,就可以使用TRIM函数,如果上例中,书名也可能是"think in java"(两边都是单引号)这样的形式的话,如果想直接获取单纯的书名,就可以使用TRIM('"' from name):
trim
('"' name id=7 注意TRIM中要删除的只能是单个字符,形如TRIM('《》' from name)是错误的!
如果要从串的某一段删除,可以使用LEADING和TRAILING字句,这时他们的作用于LTRIM和RTRIM是相同的:
leading
'"' 结果为:think in java"
2.5、大小写转换:LOWER、UPPER和INITCAP
LOWER把串或列种的任意字母转换为小写。
UPPER与LOWER相反。
INITCAP将串或列中每个单词的首字母转换成大写。
它们经常一起使用。
使用格式:
LOWER(string)
UPPER(string)
INITCAP(string)
我们可以看一下例子就清楚了:
upper
lowerinitcap book 可以看到INITCAP不但将首字母大写了,还将后面的字母转换为小写。
2.6、长度:LENGTH
使用LENGTH可以得到一个串的长度。
LENGTH(string)
例如:
length
2.7、子串:SUBSTR
SUBSTR(string,start[,count])
这个函数告诉Oracle提取string的一个子串,从start位置开始,长度为count个字符。如果不指定count,将从start开始一直到这个串结束。
如果有下面一张表:
* phonebook 如果我们需要不含区号的结果,可以这样:
rpad
firstname'.'substrphone5 phone 其中的start参数也可以是负值(仅当值类型为varchar2时,为char时不可用),这时就从串的末尾开始截取,比如上面的例子,也可以这样:
sql" lang="sql" style="font-family:Monaco,-
9 结果与前一个完全一致。
count参数值一旦指定就必须为正数,否则结果将返回null。
2.8、索引位置:INSTR
INSTR可以告诉你要搜索的字符(串)在串种的位置。
INSTR(string,set[,occurrence]])
string为要寻找的列或常量;set为要指定的要寻找的值;start可选,默认为从串的第一个位置开始搜索;occurrence可选,为指定字符串出现的第occurrence次的位置。
我们依然来看看刚刚的例子:
执行如下语句:
instr
'a' 再带上start参数:
继续加上occurrence参数:
1
2 当然,我们也可以查找一个串:
sql" lang="sql" style="font-family:Monaco,
'java' 我们也经常会将INSTR函数与||、SUBSTR等函数一起使用,比如还是这个例子:
我们要将各个列查询出来组合成一个串,其中,phone中的区号不一定就得是3位区号,有些地区就是4位,我们可以使用如下语句:
firstname
||':''-')+ phoneinfo 2.9、转码:ASCII和CHR
他们不常用。
CHR吧数值转换为等价的ASCII字符串;ASCII相反,但效果只对传递给他的值的第一个字符起作用。
一个例子:
70
chr'F'ascii('F'('FOCUS' dual 输出:70FF7070
3、在ORDER BY和WHERE子句中使用串函数
串函数可以直接用于WHERE子句中:
length
)> 或者是ORDER BY子句中:
book order
by 我们也可以使用前面介绍的函数用于复杂的子句,比如稍微复杂一点的:
instr
0and 输出:"think in java"
3.1、发音:SOUNDEX
SOUNDEX只用于WHERE子句的串函数。
他能查找在发音上类似于其他词语的单词,无需担心这两个单词是如何拼写的。
使用格式:SOUNDEX(string)
比如:
soundex
('java' 输出:《Java编程思想》
SOUNDEX还可以结合Oracle Text工具在文章总搜索单词,这会在后面专门介绍Oracle Text的文章中介绍。
4、小结
本文主要介绍了Oracle中字符串相关函数的使用。
有些函数可以在显示前调整内容:RPAD、LPAD、LTRIM、RTRIM、TRIM、LOWER、UPPER、INITCAP、SUBSTR等。
还有些函数告诉我们串的相关信息:LENGTH、INSTR、SOUNDEX等。
这些函数都可以单独或者组合使用。
- Oracle中的正则表达式
- Oracle Text工具
原文链接:https://www.f2er.com/oracle/213931.html