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··如此,语句该如何写

参考技术A 第一个
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 将数据拆分到学生表中的多个列

SQL数据处理,字符串先拆分后合并

根据条件将单个数据行拆分为多个数据行的 SQL 脚本

sql语句之拆分两列数据为多条

从sql列中拆分数据并将其保存在sql存储过程中的另一个表中的最有效方法是啥[重复]

Access(SQL) 将一个数据中的两个字段拆分为两个数据