sql - 在Oracle中将字符串拆分为多行,用管道分隔
问题描述
我在 Oracle 中有 3 列的数据,如下所示:
username user.prof values
__________________________________________
user_name1 user.prof1 1|2|3
user_name2 user.prof2 NOT_REQUIRED
user_name3 user.prof3 779|678|1|2|3
如您所见,这些值由竖线字符分隔,并且它们的编号不固定。期望的结果:
username user.prof values
__________________________________________
user_name1 user.prof1 1
user_name1 user.prof1 2
user_name1 user.prof1 3
user_name2 user.prof2 NOT_REQUIRED
user_name3 user.prof3 779
user_name3 user.prof3 678
user_name3 user.prof3 1
user_name3 user.prof3 2
user_name3 user.prof3 3
有人可以帮我弄这个吗?谢谢!!
解决方案
这是一个选项:
SQL> with test (username, user_prof, value) as
2 (select 'user_name1', 'user.prof1', '1|2|3' from dual union all
3 select 'user_name2', 'user.prof2', 'NOT_REQUIRED' from dual union all
4 select 'user_name3', 'user.prof3', '779|678|1|2|3' from dual
5 )
6 select
7 username,
8 user_prof,
9 regexp_substr(value, '[^\|]+', 1, column_value) value
10 from test cross join
11 table(cast(multiset(select level from dual
12 connect by level <= regexp_count(value, '\|') + 1
13 ) as sys.odcinumberlist));
USERNAME USER_PROF VALUE
---------- ---------- ----------------------------------------------------
user_name1 user.prof1 1
user_name1 user.prof1 2
user_name1 user.prof1 3
user_name2 user.prof2 NOT_REQUIRED
user_name3 user.prof3 779
user_name3 user.prof3 678
user_name3 user.prof3 1
user_name3 user.prof3 2
user_name3 user.prof3 3
9 rows selected.
SQL>
推荐阅读
- multidimensional-array - 获取 java.lang.ArrayIndexOutOfBoundsException:将 2d(动态列)数组转换为 1d 数组时,索引 3 超出长度 3 的范围
- eclipse - Lombok 安装程序不适用于带有 Gradle 项目的 Eclipse
- python - 为什么 list[0:len(list)+1:-1] 返回一个空列表?
- nginx - NGINX 不会在自定义目录中提供 html
- node.js - 开玩笑 - 多个 websocket 连接挂起开玩笑
- google-apps-script - 带有复选框的许多不同列的确认警报消息,并在勾选复选框时自动将时间戳输入到几列
- python - (FEniCS) 运行时错误 Uable to cast Python instance to C++ type (complied in debug mode for details)
- java - Android 9 及更低版本在不退出应用程序的情况下无法连接到未配置的 wifi 网络
- raspberry-pi - 包“git”的文件列表文件包含空文件名错误
- amazon-web-services - 如何在 Elastic Beanstalk 单实例环境中将 HTTP 重定向到 HTTPS