SQL拆分逗号分隔的字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL拆分逗号分隔的字符串相关的知识,希望对你有一定的参考价值。

表结构如下
id value class
1 3,2,4,5 no
2 5,1,1+2 yes
将value列按逗号拆分后加一列code为排序,结果如下
id value class code
1 3 no 1
1 2 no 2
1 4 no 3
1 5 no 4
2 5 yes 1
2 1 yes 2
2 1+2 yes 3
可否使用简单的sql语句实现,我不是很懂存储过程怎么编辑。

1、首先点击新建查询按钮,新建一个查询。

2、然后准备一个要分割的字符串,如下图所示。

3、接着用parsename进行分割,第二个参数是取分割后的第几个,如下图所示,第一个是最后一个位置。

4、然后最后一个才是第一个的位置。

5、接下来就可以通过位置把他们都取出来了。

6、最后就得到了字符串各个分割后的子字符串了。

参考技术A 1、先执行这一句:这里导入测试表:也就是你给的文件了;
create table TB_1 (ID INT ,VALUE VARCHAR(10),CLASS VARCHAR(10))
GO
INSERT INTO TB_1 VALUES (1,'3,2,4,5,','NO')
GO
INSERT INTO TB_1 VALUES (2,'5,1,1+2,','YES')
GO
SELECT * FROM TB_1

2、 在执行查寻,会输出你要的结果;
WITH TB_2 AS (
SELECT ID,VALUE ,CLASS,CHARINDEX(',',VALUE) STA,CHARINDEX(',',VALUE)-1 LENS FROM TB_1  
UNION ALL
SELECT ID,VALUE ,CLASS,CHARINDEX(',',VALUE,STA+1) STA,CHARINDEX(',',VALUE,STA+1)-STA-1 LENS FROM TB_2 WHERE STA<>0)
--SELECT * FROM TB_2
 
SELECT ID,SUBSTRING(VALUE,STA-LENS,LENS),class FROM TB_2
WHERE STA<>0

结果:
1 3 NO
2 5 YES
2 1 YES
2 1+2 YES
1 2 NO
1 4 NO
1 5 NO

追问

可以加Q帮我演示下么?493630907

追答CODE码可以加了,哈哈!
--创建表结构
IF(OBJECT_ID('TA') IS NOT NULL) DROP TABLE TA
CREATE TABLE TA(id INT,[value] VARCHAR(100), class VARCHAR(10))
INSERT INTO TA(id,[value],class)
SELECT 1,'3,2,4,5','no' UNION ALL
SELECT 2,'5,1,1+2','yes'  
--查询结果
SELECT T.id
  ,SUBSTRING(T.[value],R.number,CHARINDEX(',',T.[value]+',',R.number)-R.number) AS value
  ,T.class 
  ,ROW_NUMBER() OVER (PARTITION BY T.id ORDER BY T.id) AS code
FROM TA AS T
JOIN (
    SELECT TOP 10 number FROM  [master].dbo.spt_values  
    WHERE [type]='P' ORDER BY number)AS R ON (CHARINDEX(',',','+T.[value],R.number)=R.number)
--运行结果
id      value     class      code
----------- ---------------------------- ---------- --------------------
1        3         no         1
1        2         no         2
1        4         no         3
1        5         no         4
2        5         yes        1
2        1         yes        2
2        1+2       yes        3
 
(7 行受影响)

本回答被提问者采纳
参考技术B 如果你能确定逗号的位置 或就只有这两行数据 那么就很简单
如果不是 正常情况下 也是第二种 我给你一个处理问题的思路
首先写一个拆分函数
然后利用游标的知识 把结果输出来
估计对你来说有点困难追问

是哦,有上千行吧,第一个表中value这个值有很多空的,我想要第二个表的结果空的就舍掉了,不知道能不能给出代码,我用的很久,但没接触过深沉编程

追答

--给你一个拆分函数吧 你这个技术含量蛮高的 很伤脑筋的

--还是帮你写了吧  拆分函数 你要先执行 把alter改为create 然后直接执行这个存储过程 你

--就可以看到你要的效果 我只选择前面的两个列 后面的 你应该可以搞定 很简单

--如果你还不会可以来问我 希望采纳  把这个存储过程的表名换成你的表名

create proc uspCheckGblsettingValue

as

if OBJECT_ID('tempvalue') is not null drop table tempvalue

create TABLE tempvalue  (  id      nvarchar(2000)  ,                             

  tablevalue nvarchar(20)                                

  )               

declare @valueName nvarchar(500)

declare @str1 varchar(max)

declare @sql2 nvarchar(4000)

declare cs_db cursor for

select Value,id  from 表名 where Value<>'' and Value is not null and Value like '%,%'

open cs_db

fetch cs_db into @str1,@valueName

while @@fetch_status=0

begin 

set @sql2='insert into tempvalue(id,tablevalue) '+

 'select '+''''+@valueName+''''+','+ '[Value] from '+'[dbo].[SplitString]('+''''+@str1+''''+','+''','''+', 1) '

 --print(@sql2) 

 exec(@sql2)

fetch cs_db into @str1,@valueName

end

close cs_db

deallocate cs_db


select * from tempvalue

go

exec uspCheckGblsettingValue


追问

还是不太明白放到哪里执行,我的数据是在[aaa].[dbo].[test],希望执行后生成[aaa].[dbo].[testa]表。请您告诉我下先执行那段代码,再执行哪段代码,是放在存储过程里执行还是放在命令窗口里,谢谢了,肯定采纳您的意见,高手

追答

--就在查询分析器里面查询 先执行拆分函数
--在执行这个存储过程 如果你已经执行过一次 就把create改为alter
create proc uspCheckGblsettingValue
as

if OBJECT_ID('testa') is not null drop table testa
create TABLE testa ( id nvarchar(2000) ,
value nvarchar(20)
)
declare @valueName nvarchar(500)
declare @str1 varchar(max)
declare @sql2 nvarchar(4000)

declare cs_db cursor for
select Value,id from test where Value'' and Value is not null and Value like '%,%'
open cs_db
fetch cs_db into @str1,@valueName
while @@fetch_status=0
begin

set @sql2='insert into testa(id,value) '+
'select '+''''+@valueName+''''+','+ '[Value] from '+'[dbo].[SplitString]('+''''+@str1+''''+','+''','''+', 1) '
--print(@sql2)
exec(@sql2)
fetch cs_db into @str1,@valueName
end
close cs_db
deallocate cs_db

select testa.*,test.class,ROW_NUMBER() over (partition by testa.id order by testa.value) code
from testa join test on test.id=testa.id
go
exec uspCheckGblsettingValue
--用下面的存储过程 我都帮你写好了 直接执行就可以了

以上是关于SQL拆分逗号分隔的字符串的主要内容,如果未能解决你的问题,请参考以下文章

SQL拆分逗号分隔的字符串

sql 拆分逗号分隔的字符串(PIPELINED函数)

SQL:使用 SQL 将两个逗号分隔的字符串拆分为单独的索引行

sql 将逗号分隔的字符串拆分为值列表(返回游标)

如何根据一个字段是不是包含oracle sql中的逗号分隔字符串将单行拆分为多行?

我想拆分用逗号分隔的字符串并在 SQL Server 中另存为新行 [重复]