Oracle 字符串截取、替换

字符串截取

substr 函数:截取字符串

语法:substr(string, start, [length])

解释:

  • String:源字符串
  • start:开始位置,从0或1开始查找,如果start是负数,则从string字符串末尾开始算起
  • length:可选项,表示字符串的长度
--截取所有字符串,返回'Hello ghostwolf1'
SELECT SUBSTR('Hello ghostwolf1', 0) NAME FROM DUAL;
--截取所有字符串,返回'Hello ghostwolf1'
SELECT SUBSTR('Hello ghostwolf1', 1) NAME FROM DUAL;
--从第7个字符串开始截取,返回‘ghostwolf1’
SELECT SUBSTR('Hello ghostwolf1', 7) NAME FROM DUAL;
--从倒数第10个字符开始,截取到末尾,返回‘ghostwolf1’
SELECT SUBSTR('Hello ghostwolf1', -10) NAME FROM DUAL;
--从第7个字符开始,截取17个字符。返回'ghostwolf1'
SELECT SUBSTR('Hello ghostwolf1', 7, 17) NAME FROM DUAL;
--从倒数第4个字符开始,截取3个字符,返回‘ghostwolf1’
SELECT SUBSTR('Hello ghostwolf1', -10, 10) NAME FROM DUAL;

instr 函数:查找字符串位置

语法:instr(String, subString, position, ocurrence)

解释:

  • String:源字符串
  • subString:要查找的子字符串
  • position:开始的位置,默认从1开始。如果为负数,则从右向左检索
  • ocurrence:可选项,表示子字符串第几次出现在源字符串当中,默认第1次,负数则报错。
--表示从源字符串'city_company_staff'中第1个字符开始查找子字符串'_'第1次出现的位置,返回5
SELECT INSTR('ABCD_EFGHIJK_LMNOP', '_') NAME FROM dual ;   
 
--表示从源字符串'city_company_staff'中第5个字符开始查找子字符串'_'第1次出现的位置,返回5
SELECT INSTR('ABCD_EFGHIJK_LMNOP', '_', 5) NAME FROM dual;    
 
--表示从源字符串'city_company_staff'中第5个字符开始查找子字符串'_'第1次出现的位置,返回5
SELECT INSTR('ABCD_EFGHIJK_LMNOP', '_', 5, 1) NAME FROM dual;    
 
--表示从源字符串'city_company_staff'中第3个字符开始查找子字符串'_'第2次出现的位置,返回13
SELECT INSTR('ABCD_EFGHIJK_LMNOP', '_', 3, 2) NAME FROM dual ;  
 
--start参数为-1,从右向左检索,查找'_'字符串在源字符串中第1次出现的位置,返回13
SELECT INSTR('ABCD_EFGHIJK_LMNOP', '_', -1, 1) NAME FROM dual ;   
 
--start参数为-6,从右向左检索,查找'_'字符串在源字符串中第2次出现的位置,返回5
SELECT INSTR('ABCD_EFGHIJK_LMNOP', '_', -6, 2) NAME FROM dual  ;  

字符串拼接

“||” 拼接

这个相当于java里面的 “+” 号

SELECT origin_code||'000000' CODE FROM t_origin t WHERE t.leaf='0' AND t.origin_code LIKE '44%00';

输出结果:

concat() 函数

采用CONCAT进行连接,CONCAT()只允许两个参数;换言之,一次只能将两个字串串连起来(如果需要拼接多个字符串,可以进行嵌套)

SELECT CONCAT(origin_code,'000000')  CODE,t.* FROM t_origin t WHERE t.leaf='0' AND t.origin_code LIKE '44%00';

输出结果:

字符串替换

replace(char, str1, str2):把 char 中 str1 字符串替换为 str2 字符串

-- 将‘123456’中的‘456’替换成‘123’, 返回‘123123’
select replace('123456','456','123') name from dual; 

replace(char, str1):把char 中的 str1 字符串移除

-- 将‘123456’中的‘456’替换掉。返回‘123’
select replace('123456','456') name from dual;

regexp_replace(cstr_sourcear, pattern_str, rep_str):支持正则表达式,用法类似于 replace,但功能更强大

-- 将‘12345654321’中的‘2’替换成‘*’,返回‘1*34566543*1’
select regexp_replace('123456654321','2','*') name from dual; 
--将‘12345654321’中的‘[26]’替换成‘*’,返回‘1*345**543*1’
select regexp_replace('123456654321','[26]','*') name from dual; 

regexp_replace(str_source, pattern_str):把 str_source中的 pattern_str 字符串剔除

--将‘12345654321’中的‘[26]’替换掉,返回‘13455431’
select regexp_replace('123456654321','[26]') name from dual; 

translate(str_source, char1, char2):以字符为单位,把 str_source 中的 chr1 字符对应替换为 chr2。如果 chr1 比chr2 长,那么在 chr1 中而不在 chr2 中的字符将被剔除,因为没有对应的替换字符。需注意 chr2 不能为 null 或'',否则返回值也为空

--用字符'A'、'B'、'C'对应替换'a','b','c'字符;
select translate('abcc123a','abc','ABC') name from dual;
--'abc'长度为 3,'AB'长度为 2,字符'c'没有对应的字符来替换,因此被剔除掉;  
select translate('abcc123a','abc','AB') name from dual; 
--剔除掉字符'a'、'b'、'c',translate 有 # 的特殊用法,以 # 开头的表示所有字符。
select translate('abcc123a','#abc','#') name from dual; 
--先把数字筛选出来,然后用筛选出来的字符串取筛选原来的字符串,结果‘234’
select translate('阿2萨德桑的3股份的4观点','#'||translate('阿2萨德桑的3股份的4观点', '#0123456789', '#'),'#') as col from dual;
原文地址:https://www.cnblogs.com/ghostwolf1/p/14069706.html