sql数据拆分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql数据拆分相关的知识,希望对你有一定的参考价值。
如图,把字段cc的数据进行拆分,自己写的语句如下:(临时表前面已经建立)
SELECT A.id, cc= SUBSTRING(A.cc, B.id, CHARINDEX(' ', A.cc + ' ', B.id) - B.id) FROM ccc A, # B WHERE SUBSTRING(' ' + A.cc, B.id, 1) = ' '
感觉好像没什么错,担运行后却显示错误“向 substring 函数传递了无效的 length 参数” 不知哪里错了,是空格符写错了吗??请纠正
还有如果有多个字段需要数据拆分,如图
要求改成4条记录,111对应AA,222对应BB··如此,语句该如何写
FROM ccc A, # B
就该是
FROM ccc A, #临时表名 B 参考技术B 第一个没看懂
第二个这么弄
create table bbb (id varchar(20),bb varchar(20));
insert into bbb values ('111,222','AA/BB');
insert into bbb values ('333,444','CC/DD');
select substring(id,1,len(id)-CHARINDEX(',',id)) id,substring(bb,1,len(bb)-CHARINDEX('/',bb)) from bbb
union all
select substring(id,CHARINDEX(',',id)+1,len(id)) id,substring(bb,CHARINDEX('/',bb)+1,len(bb)) from bbb;追问
第一个其实想问如果数据不是用逗号隔开,而是用空格隔开,像这样“111 222”,那么语句里面是不是将‘,’替换成‘ ’这样就行了??如果是用回车隔开是用什么替换?
追答替换的话用replace
比如,你第一个截图要把空格换成逗号
select id,replace(cc,' ',',') from ccc;
第一个截图如果那个是回车
select id,replace(cc,chr(13),',') from ccc;
数据库里有很多不可见字符,如空格,回车,换行符等(当你不确定是什么的时候),要把这个需要特殊处理一下,这里就用两个举例给你
比如,假如,你第一个里边的像空格那东西不是空格,是回车或换行符
我们查查可以知道换行符的ACSII码是10,回车的ASCII码是13
select id,replace(replace(cc,chr(13),','),chr(10),',') from ccc;
如果需要拆分的数据不只两个,而是多个,如“111,222,333,444”,那么上面的您写的语句不就用不了了?
追答那你能把一次想要做的都说明白不
追问是你每次都想得太简单了
参考技术C 二楼的最后一个问题可以用循环解决吧。sql语句之拆分两列数据为多条
原数据
想要把两列进行拆分变成:
sql语句及思路
思路:先分别拆分A列和B列,以行号相等作为条件连接
select ManagerId,Manager from (SELECT ROW_NUMBER() OVER(ORDER BY b.number) as orderId,substring(PrjManager,b.number,charindex(\',\',PrjManager+\',\',b.number)-b.number) AS Manager FROM [dbo].[CM_Contract] t1 inner join master.dbo.spt_values b on b.number between 1 and len(PrjManager) and substring(\',\'+PrjManager,b.number,1)=\',\' where b.type=\'P\') as t1 inner join (SELECT ROW_NUMBER() OVER(ORDER BY cntName) as orderId,substring(PrjManagerIds,b.number,charindex(\',\',PrjManagerIds+\',\',b.number)-b.number) AS ManagerId FROM [dbo].[CM_Contract] t1 inner join master.dbo.spt_values b on b.number between 1 and len(PrjManagerIds) and substring(\',\'+PrjManagerIds,b.number,1)=\',\' where b.type=\'P\') as t2 ON t1.orderId=t2.orderId
以上是关于sql数据拆分的主要内容,如果未能解决你的问题,请参考以下文章
使用 pl/sql 或 sql 将数据拆分到学生表中的多个列