Oracle函数,按分隔符截取字符串

mekaoyou 2011-08-31 06:57:08
今天因工作需要,写了一个小函数,按分隔符截取字符串的,分享出来,希望有需要的朋友能用到。

功能实例: substrbysep('aaa,bb,ccccc,ddd,vvv',',',3)返回结果 'ccccc'.

函数:

create or replace function substrbysep(sourceString varchar2,
destString varchar2,
appearPosition number)
return varchar2 is
substring varchar2(255);

--作者:Alex Liu
--功能:按分隔符截取字符串
--参数:1、原始字符串;2、分隔符;3、截取第几段

begin
substring := substr(destString || sourceString || destString,
instr(destString || sourceString || destString,
destString,
1,
appearPosition) + 1,
instr(destString || sourceString || destString,
destString,
1,
appearPosition + 1) -
instr(destString || sourceString || destString,
destString,
1,
appearPosition) - 1);
return(substring);
end substrbysep;
/
...全文
4535 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangpengpengwang 2013-09-11
  • 打赏
  • 举报
回复
楼主也函数是尽自己所能,用正则式是尽工具所能,都牛X
hiyachen 2013-09-04
  • 打赏
  • 举报
回复
正则对于比较复杂数据类型的不太好用,比如字段中有逗号,就傻了。
善若止水 2012-12-23
  • 打赏
  • 举报
回复
八仙过海,各显神通呀!正则表达式的功能这么强大
  • 打赏
  • 举报
回复
引用 1 楼 canhui87 的回复:
SQL code?1234567用正则表达式,一步就出来了select regexp_substr('aaa,bb,ccccc,ddd,vvv','[^,]+',1,3)from dual;REGEX-----ccccc
泪牛满面
呵呵112123 2012-12-19
  • 打赏
  • 举报
回复
楼上你好。 这2天没事干,逛论坛了
小海葵1 2012-12-19
  • 打赏
  • 举报
回复
楼上你好。又看到你了。 老版本上还是能用的。
呵呵112123 2012-12-19
  • 打赏
  • 举报
回复
正则把楼主给狠狠地伤害了
c991446521 2012-12-19
  • 打赏
  • 举报
回复
好强大,学习了
雪狼__ 2012-09-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

SQL code
用正则表达式,一步就出来了
select regexp_substr('aaa,bb,ccccc,ddd,vvv','[^,]+',1,3)
from dual
;
REGEX
-----
ccccc
[/Quote]

没用过这个函数,顶一下
  • 打赏
  • 举报
回复
表示学习了。
ilovemk 2012-09-17
  • 打赏
  • 举报
回复
lz的代码在10g之前还是有参考价值的
xandercheng2 2012-09-17
  • 打赏
  • 举报
回复
正则在9i又不支持
xiaoyu871225 2011-10-29
  • 打赏
  • 举报
回复
老强大了
[Quote=引用 11 楼 benchim888 的回复:]
SQL code


--给你举个例子
[SYS@orcl] SQL>WITH t1 AS(
2 SELECT 'aasd ,asd 233,45667,23fdsf, sdfsdf, sdf235' AS col1 FROM dual
3 UNION ALL
4 SELECT '123 ,345 123,3521' AS col1 FROM dual……
[/Quote]
s_sj_gz_125 2011-09-05
  • 打赏
  • 举报
回复
BenChiM888 2011-09-03
  • 打赏
  • 举报
回复

--给你举个例子
[SYS@orcl] SQL>WITH t1 AS(
2 SELECT 'aasd ,asd 233,45667,23fdsf, sdfsdf, sdf235' AS col1 FROM dual
3 UNION ALL
4 SELECT '123 ,345 123,3521' AS col1 FROM dual
5 UNION ALL
6 SELECT 'ASDGC1,213 123344,45,56 567 67,67,78 78,98' AS col1 FROM dual
7 UNION ALL
8 SELECT 'AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D' AS col1 FROM dual
9 )SELECT T1.COL1, REGEXP_SUBSTR(COL1, '[^, ]+', 1, L) AS ANS
10 FROM T1, (SELECT LEVEL L FROM DUAL CONNECT BY LEVEL <= 100) T2
11 WHERE LENGTH(T1.COL1) - LENGTH(REPLACE(T1.COL1, ',')) + 1 >= T2.L
12 ORDER BY 1;

COL1 ANS
------------------------------------------------------------ -----------------------
123 ,345 123,3521 123
123 ,345 123,3521 123
123 ,345 123,3521 345
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D AD
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D GD
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D FG
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D GFDGD
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D YF
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D 4
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D 5
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D 234
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D 234
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D WR
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D H
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D FG
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D DG
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D DG
AD,ASD,DG,DG,FG,H,WR,234,234,5,4,YF,GFDGD GD,FG DFG,DFG D ASD
ASDGC1,213 123344,45,56 567 67,67,78 78,98 56
ASDGC1,213 123344,45,56 567 67,67,78 78,98 123344
ASDGC1,213 123344,45,56 567 67,67,78 78,98 ASDGC1
ASDGC1,213 123344,45,56 567 67,67,78 78,98 213
ASDGC1,213 123344,45,56 567 67,67,78 78,98 67
ASDGC1,213 123344,45,56 567 67,67,78 78,98 45
ASDGC1,213 123344,45,56 567 67,67,78 78,98 567
aasd ,asd 233,45667,23fdsf, sdfsdf, sdf235 asd
aasd ,asd 233,45667,23fdsf, sdfsdf, sdf235 sdfsdf
aasd ,asd 233,45667,23fdsf, sdfsdf, sdf235 45667
aasd ,asd 233,45667,23fdsf, sdfsdf, sdf235 233
aasd ,asd 233,45667,23fdsf, sdfsdf, sdf235 aasd
aasd ,asd 233,45667,23fdsf, sdfsdf, sdf235 23fdsf

已选择31行。
pw138 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 canhui87 的回复:]

SQL code
用正则表达式,一步就出来了
select regexp_substr('aaa,bb,ccccc,ddd,vvv','[^,]+',1,3)
from dual
;
REGEX
-----
ccccc
[/Quote]
+1
mekaoyou 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 canhui87 的回复:]
SQL code
用正则表达式,一步就出来了
select regexp_substr('aaa,bb,ccccc,ddd,vvv','[^,]+',1,3)
from dual
;
REGEX
-----
ccccc
[/Quote]

学习了,确实很牛!
yejihui9527 2011-09-01
  • 打赏
  • 举报
回复
substring := substr(sourceString,
instr(sourceString,
destString,
1,
appearPosition - 1) + 1,
instr(sourceString ,
destString,
1,
appearPosition) -
instr(sourceString,
destString,
1,
appearPosition - 1) - 1);
return(substring);
mallity 2011-09-01
  • 打赏
  • 举报
回复
学习
Alessandro_ 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 canhui87 的回复:]

SQL code
用正则表达式,一步就出来了
select regexp_substr('aaa,bb,ccccc,ddd,vvv','[^,]+',1,3)
from dual
;
REGEX
-----
ccccc
[/Quote]+
加载更多回复(5)

17,141

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧