oracle根据分隔符将单字段拆分成多行

本文介绍如何使用SQL查询将数据库中以逗号分隔的‘去过的城市’字段转换为多行数据,通过CREATE TABLE、INSERT INTO和复杂的子查询实现,适合初学者理解列转行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在数据存储数据库中,常常存在信息以特殊符号隔开形式存储在一个字段里,如下表:

员工姓名去过的城市
张三云南、北京、上海
李四西安、重庆、成都
小花甘肃、深圳

当我们需要把“去过的城市”字段以逗号(,)拆分成多行时,如下表:

员工姓名去过的城市
张三云南
张三北京
张三上海
李四武汉
李四重庆
李四西安

这时就会涉及到列转行,下面跟着我的例子,一起来见证奇迹吧:

创建表


CREATE TABLE userinfomation (
  id number(2)  NOT NULL,
  username varchar(200) DEFAULT NULL,
  city varchar(500) DEFAULT NULL
) 

插入测试数据:

insert into userinfomation values(1,'张三','云南、北京、上海');
insert into userinfomation values(2,'李四','西安、重庆、成都');
insert into userinfomation values(3,'小花','甘肃、深圳');

查询sql

将代码拷贝使用时,需要更改表名、字段名、分隔字符等(注:使用的时候还需将将N替换为分隔符的长度,如分割符“、”,长度位1,则将N替换位1,一共4处)。

SELECT id,substr(a.city, instr(a.city, '、', 1, levels.lvl) + N, instr(a.city, '、', 1, levels.lvl + 1) -(instr(a.city, '、', 1, levels.lvl) + 1)-(N-1)) as city,username
FROM
(SELECT id,'、' || city || '、' AS city,username,(length(city || '、') - nvl(length(REPLACE(city, '、')), 0))/N AS cnt
FROM userinfomation) a,
(SELECT rownum AS lvl
FROM (SELECT (MAX(length(city || '、') - nvl(length(REPLACE(city, '、')), 0)))/N max_len FROM userinfomation)
CONNECT BY LEVEL <= max_len) levels
WHERE levels.lvl <= a.cnt
ORDER BY id,levels.lvl;

执行结果

在这里插入图片描述
可以从上截图看出,已经将userinfomation表的city 字段根据“、”号分割后,形成多行数据。赶快去试试吧。有问题欢迎评论区留言哦。
借鉴原文来至:

https://blog.youkuaiyun.com/qq_20481125/article/details/99550208, https://www.cnblogs.com/su-root/p/15008584.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值