ORACLE 一个单元格的值拆分成多个 ,请见例子

liuwenjun3001 2008-12-10 10:20:32
如:
字段名: A B C
1 1,2,3 1
2 1,2,3,4 2
现在想实现如下:
字段名: A B B1 B2 B3 C
1 1 2 3 1
2 1 2 3 4 2
也就是把B列的值按照逗号分隔符分成多列,ORACLE里可以实现吗?(B列的值都是以','分隔)
...全文
458 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyong369 2008-12-10
  • 打赏
  • 举报
回复
固定好办,
不固定那就是老问题动态列转行.
mantisXF 2008-12-10
  • 打赏
  • 举报
回复
CONNECT BY .. SUBSTR .. INSTR .. ROW_NUMBER OVER.. DECODE .. MAX ..
[Quote=引用 5 楼 liuwenjun3001 的回复:]
引用 3 楼 sleepzzzzz 的回复:
固定好办,
不固定那就是老问题动态列转行.


就是不固定啊,请问如何动态列转行 ? 给个思路,谢谢
[/Quote]
sleepzzzzz 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liuwenjun3001 的回复:]
引用 3 楼 sleepzzzzz 的回复:
固定好办,
不固定那就是老问题动态列转行.


就是不固定啊,请问如何动态列转行 ? 给个思路,谢谢
[/Quote]

上面我说错了,你这个不是动态行转列,只是类似.

大致可以这样做试试:
在procedure里,构建动态sql,依此sql来创建一个视图,然后你去查这个视图.
liuwenjun3001 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sleepzzzzz 的回复:]
固定好办,
不固定那就是老问题动态列转行.
[/Quote]

就是不固定啊,请问如何动态列转行 ? 给个思路,谢谢
dawugui 2008-12-10
  • 打赏
  • 举报
回复
不知道oracle中是否有类似sql server的PARSENAME函数,如果有就好办了.


PARSENAME
返回对象名的指定部分。可以检索的对象部分有对象名、所有者名称、数据库名称和服务器名称。



说明 PARSENAME 函数不表明所指定名称的对象是否存在,而只是返回给定对象名的指定部分。


语法
PARSENAME ( 'object_name' , object_piece )

参数
'object_name'

要检索其指定部分的对象名。object_name 是 sysname 值。本参数是可选的合法对象名。如果该对象名的所有部分均符合要求,则该名称由以下四部分组成:服务器名称、数据库名称、所有者名称和对象名。

object_piece

要返回的对象部分。object_piece 是 int 值,可以为下列值。

Value 描述
1 对象名
2 所有者名称
3 数据库名称
4 服务器名称


返回类型
nchar

注释
如果符合下列条件之一,则 PARSENAME 返回 NULL 值:

object_name 或 object_piece 为 NULL 值。


发生语法错误。


所请求的对象部分长度为 0,并且是无效的 Microsoft® SQL Server™ 标识符。零长度的对象名将导致整个合法名称无效。
示例
本示例使用 PARSENAME 返回有关 pubs 数据库中 authors 表的信息。

USE pubs
SELECT PARSENAME('pubs..authors', 1) AS 'Object Name'
SELECT PARSENAME('pubs..authors', 2) AS 'Owner Name'
SELECT PARSENAME('pubs..authors', 3) AS 'Database Name'
SELECT PARSENAME('pubs..authors', 4) AS 'Server Name'

下面是结果集:

Object Name
------------------------------
authors

(1 row(s) affected)

Owner Name
------------------------------
(null)

(1 row(s) affected)

Database Name
------------------------------
pubs

(1 row(s) affected)

Server Name
------------------------------
(null)

(1 row(s) affected)

sleepzzzzz 2008-12-10
  • 打赏
  • 举报
回复
固定好办,
不固定那就是老问题动态列转行.
bw555 2008-12-10
  • 打赏
  • 举报
回复
最大列数固定的话可以,试一下
select A,
substr(B,instr(b,',')-1) as b1,
substr(B,instr(b,',')+1,instr(b,',',2)-substr(B,instr(b,',',1)-1)) as b2,
substr(B,instr(b,',',2)+1,instr(b,',',3)-substr(B,instr(b,',',2)-1)) as b3,
substr(B,instr(b,',',3)+1,instr(b,',',4)-substr(B,instr(b,',',3)-1)) as b4,
c from table
liuwenjun3001 2008-12-10
  • 打赏
  • 举报
回复
写清楚一些。。

如:
A B C
1 1,2,3 1
2 1,2,3,4 2
现在想实现如下:
A B B1 B2 B3 C
1 1 2 3 1
2 1 2 3 4 2
也就是把B列的值按照逗号分隔符分成多列,ORACLE里可以实现吗?(B列的值都是以','分隔)
liuwenjun3001 2008-12-10
  • 打赏
  • 举报
回复
有没有具体一点的思路。。谢谢。大家都说得比较模糊。
sjq521521 2008-12-10
  • 打赏
  • 举报
回复
学习中...
junying2yu 2008-12-10
  • 打赏
  • 举报
回复
用个循环就可以呀

17,086

社区成员

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

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