递归查询-小结
场景,基于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 可以
可以看到,切割完毕,导到递归取出所有词语的效果