递归查询-小结

场景,基于SQLServer,处理长字符串,以固定分隔符取出所有分隔的字段

源数据:

id 标签
1 好,酷,非常棒,非常好
2 非常好
3 还行,非常棒
4 非常好, 一般, 太好了
5 不错,可以

/****** Script for SelectTopNRows command from SSMS  ******/
with x(id,word,rest) as ( --递归查询
select id ,REPLACE(substring(标签,1,CHARINDEX(',',标签)),',','') AS word ,
--CHARINDEX 取分隔符的位置,如果没有则取到0,substring取切割出来的第一个词的字符串,如果没有分隔符,可能为空
--replace处理可能切割出来的,
substring(标签,CHARINDEX(',',标签)+1,len(标签)) as rest 
--取剩余字符串,不包含首个分隔符
from dbo.Table_1
union all
--union all 用于凭借对x的查询,实现递归
select id,REPLACE(substring(rest,1,CHARINDEX(',',rest)),',','') word,
--从X查询的rest字段中取第一个词,格式同上
substring(rest,CHARINDEX(',',rest)+1,len(rest)) rest  
from x where CHARINDEX(',',rest) != 0
--设置终止条件,否则无限递归
),
y as ( --用于递归,汇总出结果
select id,word,rest from x
union all 
select id,REPLACE(substring(rest,1,CHARINDEX(',',rest)),',','') word,substring(rest,CHARINDEX(',',rest)+1,len(rest)) rest  from x where CHARINDEX(',',word) != 0 or len(rest) != 0  
),
z(id,word) as(
select id,word from y where len(word) > 0 --过滤汇总结果中的空字符,标签字段中不包含分隔符时出现
union
select id,rest from y where CHARINDEX(',',rest) = 0 --汇总最后一个分割字符串
)
select id,ltrim(rtrim(word)) 词语 from z --格式化,删除左右空格

查询结果如下:

id 词语
1 非常棒
1 非常好
1 好
1 酷
2 非常好
3 非常棒
3 还行
4 太好了
4 一般
4 非常好
5 不错
5 可以

可以看到,切割完毕,导到递归取出所有词语的效果

posted on 2019-04-29 13:17  氵斤  阅读(212)  评论(0编辑  收藏  举报