oracle把一列中数据分割成多列 sql

本文介绍了一种使用SQL将单列数据根据特定字符分割为多列的方法。通过实例演示了如何利用INSTR和SUBSTR函数来实现这一目的,并提供了两种不同的分割方式。

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

有时候根据实际需求,我们可能需要把一个列中的数据分割成多列去查询或存储。
那么首先,要确定根据什么要求去分割列,特定字符,或字符顺序等。
下面是根据符号‘,'进行分列
SQL>create table test(name varchar2(50));
SQL>insert into test values('JL=合格,RQ=2014年XX月XX日');
SQL>commit;
SQL>select instr(name,',') from test;
INSTR(NAME,',')
---------------
              6
SQL>select substr(name,1,instr(name,',')-1) jl, substr(name,instr(name,',')+1) rq from test; //注意符号全半角
JL                             RQ
------------------------------ ------------------------------
JL=合格                        RQ=2014年XX月XX日

如果数据比较规范,也可以 根据特等顺序分列
SQL >select substr(name,1,5) jl,substr(name,7) rq from test;
JL                             RQ
------------------------------ ------------------------------
JL=合格                        RQ=2014年XX月XX日


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29193965/viewspace-1274510/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29193965/viewspace-1274510/

### Oracle 数据库中将字符串分割多列Oracle 数据库中,可以通过多种方式来实现将逗号分隔的字符串拆分为多个单独的值并将其显示为多行或多列。一种常见的方式是利用 `REGEXP_SUBSTR` 函数配合自定义表函数或递归查询来完此任务。 #### 使用 REGEXP_SUBSTR 和 CONNECT BY 实现单行列转多行 对于简单的场景下,如果只需要把一个由逗号连接起来的一串字符变每一项占据一行的形式,则可以采用如下 SQL 查询语句: ```sql SELECT TRIM(REGEXP_SUBSTR('x,y,z,a,b,c', '[^,]+', 1, LEVEL)) AS value FROM dual CONNECT BY REGEXP_SUBSTR('x,y,z,a,b,c' , '[^,]+', 1, LEVEL) IS NOT NULL; ``` 这段代码会返回每一条记录代表原输入中的每一个元素[^1]。 #### 将结果集横向展开转换为固定数量的列 当希望得到的结果是以若干列为单位而不是多行时(即所谓的“宽表”形式),则可以根据预期的最大宽度预先设定好所需的列数,并通过类似下面的例子来进行变换: 假设已知待解析后的列表长度不会超过三个项目,那么就可以这样写: ```sql WITH data (str) AS ( SELECT 'x,y,z' FROM DUAL UNION ALL SELECT 'a,b' FROM DUAL ), split_data AS( SELECT str, REGEXP_COUNT(str, ',') + 1 cnt, CAST(NULL AS VARCHAR2(4000)) col1, CAST(NULL AS VARCHAR2(4000)) col2, CAST(NULL AS VARCHAR2(4000)) col3 FROM data ) SEARCH DEPTH FIRST BY str SET order_id CYCLE str SET is_cycle TO 1 DEFAULT 0 SELECT s.str "Original String", MAX(CASE WHEN rn = 1 THEN val END) "Column_1", MAX(CASE WHEN rn = 2 THEN val END) "Column_2", MAX(CASE WHEN rn = 3 THEN val END) "Column_3" FROM split_data sd, LATERAL(SELECT ROWNUM rn,val FROM XMLTABLE(('"' || REPLACE(sd.str,',','","')||'"')) ) t(val) GROUP BY s.str; ``` 上述脚本首先创建了一个包含测试数据数据集 `data` ,接着计算每个字符串中有多少个组部分存入临时视图 `split_data`. 接着使用 `LATERAL` 关键字联合子查询对原始字符串进行了切割操作,最后按照原来的字符串聚合这些被切开的部分到不同的列上.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值