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、先执行这一句:这里导入测试表:也就是你给的文件了;
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 行受影响)
如果不是 正常情况下 也是第二种 我给你一个处理问题的思路
首先写一个拆分函数
然后利用游标的知识 把结果输出来
估计对你来说有点困难
是哦,有上千行吧,第一个表中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