SQL拆分逗号分隔的字符串

表结构如下idvalueclass13,2,4,5no25,1,1+2yes将value列按逗号拆分后加一列code为排序,结果如下idvalueclasscode13n... 表结构如下
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语句实现,我不是很懂存储过程怎么编辑。
展开
 我来答
百度网友faadf46
高粉答主

2019-09-12 · 说的都是干货,快来关注
知道答主
回答量:4556
采纳率:0%
帮助的人:71.1万
展开全部

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

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

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

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

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

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

COUNTIFABS
推荐于2017-10-02 · TA获得超过2154个赞
知道大有可为答主
回答量:1594
采纳率:55%
帮助的人:1222万
展开全部
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 行受影响)
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
17号观察室
2013-06-30 · TA获得超过5730个赞
知道大有可为答主
回答量:3666
采纳率:66%
帮助的人:1338万
展开全部
如果你能确定逗号的位置 或就只有这两行数据 那么就很简单
如果不是 正常情况下 也是第二种 我给你一个处理问题的思路
首先写一个拆分函数
然后利用游标的知识 把结果输出来
估计对你来说有点困难
更多追问追答
追问
是哦,有上千行吧,第一个表中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


已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式