sql一行拆分多行记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql一行拆分多行记录相关的知识,希望对你有一定的参考价值。
例如表A
a b
张三 101
李四 101,103,102
王五 101,104
王六
拆分成
张三 101
李四 101
李四 103
李四 102
王五 101
王五 104
王六
b列以逗号隔开,可能没有,可能有N个,跪求高手解答,帮忙解答了追分加满,谢谢了
QL> select * from t00;
ID ACHAR
---------- ----------
1 ab,ac,ad
1 cc,cf
2 bb,bc,be
SQL> select * from (select id,regexp_substr(achar,'[^,]+',1,level) achar from t00 connect by level<=length(achar)-length(regexp_replace(achar,',',''))+1) group by id,achar order by id ;
ID ACHAR
---------- --------------------
1 ab
1 ac
1 ad
1 cc
1 cf
2 bb
2 bc
2 be
已选择8行。 参考技术A SELECT a,REGEXP_SUBSTR (b, '[^,]+', 1,rownum)
from 表A
--先加上查询条件,查一个试下
--再把条件注释掉看下
where a='李四'
connect by rownum<=LENGTH (b) - LENGTH (regexp_replace(b, ',', ''))+1 参考技术B 百度 sqlserver split,然后用split函数实现。 参考技术C http:// www. 2cto. com/database/201208/149460.html
参考考看
将一行拆分为多行(固定宽度)
【中文标题】将一行拆分为多行(固定宽度)【英文标题】:Split one row into multiple rows (fixed width) 【发布时间】:2011-10-27 17:31:48 【问题描述】:一行传入记录有多个连接的子记录。每个子记录长 9 个字符。我在每一行中有 8 个这样的子记录。所以每一行都是(8x9=72 char)。有没有办法可以在这里将 1 条记录拆分为 8 条记录?
输入
123456789123456789123456789123456789123456789123456789123456789123456789
输出
123456789
123456789
123456789
123456789
123456789
123456789
123456789
123456789
我知道我可以用 8 个子查询来做到这一点并将它们合并.. 有更好的方法吗?
【问题讨论】:
如果你需要一个真正的分割oracle函数,也许你可以访问这个链接:Oracle split问候 【参考方案1】:或者这个怎么样:
SELECT substr(t1.astr,n*9+1,9)
FROM t1,
(SELECT ROWNUM-1 n FROM dual CONNECT BY LEVEL <= 8) t2
表 t1 包含您的字符串,表 t2 是生成的从 0 到 7 的序列号列表,通过将其交叉连接到 t1 表,我们可以使用它来分割字符串列。
【讨论】:
在迭代器上比我的解决方案好得多。 substr 需要稍微改变一下。以下内容经过测试和工作:select t2.n, substr('123456789123456789123456789123456789123456789123456789123456789123456789',n*9+1,9) from dual, (SELECT ROWNUM-1 n FROM dual CONNECT BYpan> t 干杯哥们,发现得很好,已经更正了,(我是时候在我的 linux 服务器上安装 oracle 了) 对如何在 MySQL 中执行此操作有任何想法吗? 是的,您可以将 t2 视为可能包含序列号的表的交叉连接?【参考方案2】:我看到人们使用仅包含值 1 到 8 的辅助表,然后加入该表。您可以使用该值对您的记录进行子串化。
有点像
SELECT SUBSTRING(long_val, eight.value * 9, 9)
FROM mytable, eight
注意:查询未经测试,但我希望这个想法得到传达。
【讨论】:
这是个好主意,也许您可以使用 ALL_OBJECTS 视图生成必要的行数(通过使用 rownum 并定义创建所需行数的逻辑)【参考方案3】:如果可以预测每行将始终分成固定数量的行,则应该可以执行以下操作:
select
b.iterator,
substr(a.mystring,b.iterator*9-8,9) as split
from
(select '123456789123456789123456789123456789123456789123456789123456789123456789' as mystring from dual) a,
(select 1 as iterator from dual union
select 2 as iterator from dual union
select 3 as iterator from dual union
select 4 as iterator from dual union
select 5 as iterator from dual union
select 6 as iterator from dual union
select 7 as iterator from dual union
select 8 as iterator from dual) b
编辑:Kevin 的迭代器比我的蛮力版本更简单、更好。 b 子查询应该是 (SELECT ROWNUM as iterator FROM dual CONNECT BY LEVEL
【讨论】:
以上是关于sql一行拆分多行记录的主要内容,如果未能解决你的问题,请参考以下文章