想写一个split函数拆分字符串,不知道能否实现

kingstarer 2012-08-17 09:54:42
库表结构如下:

create table demotab(oid number, namelist varchar2(5000));


里面数据格式如下:
oid|namelist
1|a,b,c
2|d,e,f
...许多行

============================
希望写一个函数,能返回以下两列

oid, name
1, a
1, b
1, c
2, d
2, e
2, f
...许多行
===========================
不知道是否可行,网上有一个split函数(http://www.cnblogs.com/linbaoji/archive/2009/09/17/1568252.html),只能处理固定的字符串,而且只能返回一列
无法两列多行
...全文
246 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
碧水幽幽泉 2012-08-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
谢谢 找人帮我写了一个


SQL code


--建立对象类型
CREATE or replace TYPE mytype AS OBJECT (
field1 NUMBER,
field2 VARCHAR2 (50)
);
--建立复合类型
CREATE TYPE mytypelist AS TABLE OF mytype;
--建立函数
CREATE OR RE……
[/Quote]
经验之谈:能用SQL语句解决的优先考虑SQL,其次考虑PL/SQL块,再次考虑存储过程或者函数。
希望对你有用。
kingstarer 2012-08-17
  • 打赏
  • 举报
回复
谢谢 找人帮我写了一个


--建立对象类型
CREATE or replace TYPE mytype AS OBJECT (
field1 NUMBER,
field2 VARCHAR2 (50)
);
--建立复合类型
CREATE TYPE mytypelist AS TABLE OF mytype;
--建立函数
CREATE OR REPLACE FUNCTION pipelineme2(v_cur sys_refcursor)
RETURN mytypelist PIPELINED
IS

碧水幽幽泉 2012-08-17
  • 打赏
  • 举报
回复
SQL> with tmp as
2 (
3 select '1|a,b,c' str from dual union all
4 select '2|d,e,f' str from dual
5 )
6 select distinct id, regexp_substr(name,'[^,]+',1,level) name
7 from (select substr(str,1,instr(str,'|')-1) id,
8 substr(str,instr(str,'|')+1) name
9 from tmp
10 )
11 connect by level<=length(name)-length(replace(name,',',''))+1
12 order by id, name;

ID NAME
-------------- --------------
1 a
1 b
1 c
2 d
2 e
2 f

6 rows selected
碧水幽幽泉 2012-08-17
  • 打赏
  • 举报
回复
方法有很多,给你写一种通常的写法吧!

SQL> with tmp as
2 (
3 select '1|a,b,c' str from dual union all
4 select '2|d,e,f' str from dual
5 )
6 select distinct id, regexp_substr(name,'[^,]+',1,level) name
7 from (select substr(str,1,instr(str,'|')-1) id,
8 substr(str,instr(str,'|')+1) name
9 from tmp
10 )
11 connect by level<=length(name)-length(replace(name,',',''))+1
12 order by id, name;

ID NAME
-------------- --------------
1 a
1 b
1 c
2 d
2 e
2 f

6 rows selected
软件钢琴师 2012-08-17
  • 打赏
  • 举报
回复
你可以先把 namelist 列拆分成很多列,然后再列转行,这个有很多例子可以搜索借鉴的

17,086

社区成员

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

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