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 将两个逗号分隔的字符串拆分为单独的索引行