原文:在论坛中出现的比较难的sql问题:25(字符串拆分3)


最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。

1、求教超难的字符串去重问题?
http://bbs.csdn.net/topics/390719864

现在小弟有如此一数据表

结构如下:

select 1 as tname,'01:0102;02:0102;03:0102;04:0102,0101;05:0102'as tstr into tb1

insert into tb1 select 2,'01:0101,0102'

insert into tb1 select 3,'01:0102;02:0102;03:0102;04:0102;05:0102'

insert into tb1 select 4,'01:0102,0103'

insert into tb1 select 5,'0104'

insert into tb1 select 6,'01:0102;02:0102;03:0102;04:0102;05:0102'

insert into tb1 select 7,'01:0102;02:0102;03:0102;04:0102,0101;05:0102'

上表数据代表的含义

tname 为序号,不用管

tstr  为编组内容

01:0101,0102 意思为01组,组员为编号0101和0102两人组成。

01:0102;02:0102 意思为编号0102的组员,即在01组,又在02组。

可见有很多重复。

现在查询想得到如下结果:即找出这几些编组到底有哪些组员:

0101,0102,0103,0104

求存储过程,不能创建自定义函数,谢谢

注意数据库版本为sqlserver 2k

我的方法:


  1. --drop table tbl
  2. create table tbl(tname int,tstr varchar(100))
  3. insert into tbl
  4. select 1 ,'01:0102;02:0102;03:0102;04:0102,0101;05:0102'
  5. insert into tbl
  6. select 2,'01:0101,0102'
  7. insert into tbl
  8. select 3,'01:0102;02:0102;03:0102;04:0102;05:0102'
  9. insert into tbl
  10. select 4,'01:0102,0103'
  11. insert into tbl
  12. select 5,'0104'
  13. insert into tbl
  14. select 6,'01:0102;02:0102;03:0102;04:0102;05:0102'
  15. insert into tbl
  16. select 7,'01:0102;02:0102;03:0102;04:0102,0101;05:0102'
  17. go


  1. declare @str varchar(1000)
  2. set @str = ''
  3. select @str = @str + ','+ [编组]
  4. from
  5. (
  6. select --*,
  7. distinct
  8. case when vv like '%:%' then SUBSTRING(vv,charindex(':',vv)+1,len(vv))
  9. else vv
  10. end '编组'
  11. from
  12. (
  13. select tname,
  14. tstr,
  15. v,
  16. SUBSTRING(t.v, number ,CHARINDEX(',',t.v+',',number)-number) vv
  17. from
  18. (
  19. select tname,
  20. tstr,
  21. SUBSTRING(t.tstr, number ,CHARINDEX(';',t.tstr+';',number)-number) v
  22. from tbl t,master..spt_values s
  23. where s.number >=1
  24. and s.type = 'P'
  25. and SUBSTRING(';'+t.tstr,s.number,1) = ';'
  26. )t,master..spt_values s
  27. where s.number >=1
  28. and s.type = 'P'
  29. and SUBSTRING(','+t.v,s.number,1) = ','
  30. )t
  31. )t
  32. order by [编组]
  33. select stuff(@str,1,1,'') as [编组]
  34. /*
  35. 编组
  36. 0101,0102,0103,0104
  37. */

发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

在论坛中出现的比较难的sql问题:25(字符串拆分3)的更多相关文章

  1. 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  2. 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  3. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  4. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  5. 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  6. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  7. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  8. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  9. 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)

    原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  10. 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)

    原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

随机推荐

  1. android -------- GifView 显示gif图片

    最近的项目需要在界面显示Gif动图,查找网络资料,总结了一下,分享一下, 一个GifView的gif图加载库以有效地显示GIF, 您可以启动,暂停和停止gifView 在app 的 build.gra ...

  2. Java基础 Scanner 使用nextLine接收字符串

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  3. Java基础 if if-else if-else if-else 三种示例

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  4. Java基础 for 单层循环示例

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  5. 算法习题---5-4交换学生(UVa10763)

    一:题目 有一组学生,他们手中分别有自己学校和想要去的目标学校(A,B).为了成功的交换学生,必须保证这一组学生中必须每两个人之间满足 s1 (A,B) 和 s2 (B,A).即两者原来和目标学校相对 ...

  6. Python机器学习实践指南pdf (中文版带书签)、原书代码、数据集

    Python机器学习实践指南 目 录 第1章Python机器学习的生态系统 1 1.1 数据科学/机器学习的工作 流程 2 1.1.1 获取 2 1.1.2 检查和探索 2 1.1.3 清理和准备 3 ...

  7. clientHeight,offsetHeight,scrollHeight迷一样的三个值

    https://blog.csdn.net/qq_39083004/article/details/78498178 https://www.imooc.com/article/17571  推荐 o ...

  8. Python3之内建模块hashlib

    摘要算法简介 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串( ...

  9. 13点睛Spring4.1-Spring EL

    13.1 Spring EL Spring EL-Spring表达式语言,支持在xml和注解中使用表达式,类似jsp的EL表达式语言; 本教程关注于在注解中使用Spring EL; Spring EL ...

  10. jvm(1)---java内存结构

    jvm主要由三个子系统构成:类加载子系统,运行时数据区,执行引擎 运行时数据区主要包括: 1.本地方法栈:登记native方法,执行时加载本地方法库 2.程序计数器:就是一个指针,用来存储指向下一条执 ...