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一行拆分多行记录的主要内容,如果未能解决你的问题,请参考以下文章

根据列值将一行拆分为多行

sql数据拆分

SQL实现将多行记录合并成一行

SQL实现将多行记录合并成一行

SQL实现将多行记录合并成一行

SQL实现将多行记录合并成一行