一、正截取 |
字符串截取的方法有两种: |
方法一:substr( '字符串' ,开始位置) |
范例: |
select substr( 'ename' ,2) from dual; |
方法二:substr( '字符串' ,开始位置,要截取的长度) |
范例: |
select substr( 'eanme' ,2,4) from dual; |
注:Oracle数据库中在截取字符串是做到了足够的智能,在开始的下标为0或者是1都是从第一个位置开始截取 |
二、反截取 |
范例:要求截取名字的后三位 |
传统思路:: select ename,substr(ename,length(ename)-2) from scott.emp; |
创新思路: select ename ,substr(ename,-3) from scott.emp; |
面试题:请问在substr()函数截取的时候下标是从0还是从1开始的? |
答:在Oracle数据库中,substr()函数从0或者是1开始都一样的; |
substr()函数也可以设置负数,表示由后指定截取的开始点。 |
****************************************************************** |
以下是代码片段: |
Declare @S1 varchar (100) |
Select @S1= 'http://www.xrss.cn' |
Select Left (@S1,4) |
------------------------------------ |
显示结果: http |
B.截取从字符串右边开始N个字符(例如取字符www.163.com) |
以下是代码片段: |
Declare @S1 varchar (100) |
Select @S1= 'http://www.163.com' |
Select right (@S1,11) |
------------------------------------ |
显示结果: www.163.com |
C.截取字符串中任意位置及长度(例如取字符www) |
以下是代码片段: |
Declare @S1 varchar (100) |
Select @S1= 'http://www.xrss.cn' |
Select SUBSTRING (@S1,8,3) |
------------------------------------ |
显示结果: www |
以上例子皆是已知截取位置及长度,下面介绍未知位置的例子 |
2.截取未知位置的函数 |
A.截取指定字符串后的字符串(例如截取http://后面的字符串) |
方法一: |
以下是代码片段: |
Declare @S1 varchar (100) |
Select @S1= 'http://www.xrss.cn' |
Select Substring (@S1,CHARINDEX( 'www' ,@S1)+1,Len(@S1)) |
|
------------------------------------ |
显示结果: www.163.com |
需要注意:CHARINDEX函数搜索字符串时,不区分大小写,因此CHARINDEX( 'www' ,@S1)也可以写成CHARINDEX( 'WWW' ,@S1) |
方法二:(与方法一类似) |
以下是代码片段: |
Declare @S1 varchar (100) |
Select @S1= 'http://www.xrss.cn' |
Select Substring (@S1,PATINDEX( '%www%' ,@S1)+1,Len(@S1)) |
--此处也可以这样写:Select |
Substring (@S1,PATINDEX( '%//%' ,@S1)+2,Len(@S1)) |
------------------------------------ |
显示结果: www.163.com |
函数PATINDEX与CHARINDEX区别在于:前者可以参数一些参数,增加查询的功能 |
方法三: |
以下是代码片段: |
Declare @S1 varchar (100) |
Select @S1= 'http://www.xrss.cn' |
Select REPLACE (@S1, 'http://' , '' ) |
------------------------------------ |
显示结果: www.163.com |
利用字符替换函数 REPLACE ,将除需要显示字符串外的字符替换为空 |
方法四: |
以下是代码片段: |
Declare @S1 varchar (100) |
Select @S1= 'http://www.xrss.cn' |
Select |
STUFF(@S1,CHARINDEX( 'http://' ,@S1),Len( 'http://' ), '' ) |
------------------------------------ |
显示结果: www.163.com |
函数STUFF与 REPLACE 区别在于:前者可以指定替换范围,而后者则是全部范围内替换 |
B.截取指定字符后的字符串(例如截取C:\Windows\test.txt中文件名) |
与A不同的是,当搜索对象不是一个时,利用上面的方法只能搜索到第一个位置 |
方法一: |
以下是代码片段: |
Declare @S1 varchar (100) |
Select @S1= 'C:\Windows\test.txt' |
select right (@S1,charindex('\',REVERSE(@S1))-1) |
------------------------------------- |
显示结果: text.txt |
利用函数REVERSE获取需要截取的字符串长度 |