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


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

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

字符串检索问题:http://bbs.csdn.net/topics/390608926

这是 http://bbs.csdn.net/topics/390530288  问题的 一个变种



ID    IndexArr

1     1,2,3,4,5

2     55,6,99,87,1000

3     7,567567,567,43,123

IndexArr 是","分割的数字

现在有字符串 '2,34,45,345,867,4,984'  

现在要检索的是  IndexArr 中每一个数字都在 字符串中出现过的  结果集。

我的解法:


  1. --1.函数
  2. if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')
  3. drop function dbo.f_splitSTR
  4. go
  5. create function dbo.f_splitSTR
  6. (
  7. @s varchar(8000), --要分拆的字符串
  8. @split varchar(10) --分隔字符
  9. )
  10. returns @re table( --要返回的临时表
  11. col varchar(1000) --临时表中的列
  12. )
  13. as
  14. begin
  15. declare @len int
  16. set @len = LEN(@split) --分隔符不一定就是一个字符,可能是2个字符
  17. while CHARINDEX(@split,@s) >0
  18. begin
  19. insert into @re
  20. values(left(@s,charindex(@split,@s) - 1))
  21. set @s = STUFF(@s,1,charindex(@split,@s) - 1 + @len ,'') --覆盖:字符串以及分隔符
  22. end
  23. insert into @re values(@s)
  24. return --返回临时表
  25. end
  26. go
  27. --> 测试数据:[tb]
  28. if object_id('[tb]') is not null
  29. drop table [tb]
  30. go
  31. create table [tb]([ID] int,[IndexArr] varchar(19))
  32. insert [tb]
  33. select 1,'1,2,3,4,5' union all
  34. select 2,'55,6,99,87,1000' union all
  35. select 3,'7,567567,567,43,123' union ALL
  36. SELECT 4,'2,34,45'
  37. --------------开始查询--------------------------
  38. DECLARE @s VARCHAR(1000)
  39. SET @s= '2,34,45,345,867,4,984'
  40. ;with t
  41. as
  42. (
  43. select t.ID,
  44. t.IndexArr,
  45. f.col,
  46. --把IndexArr按照分隔符,拆分成了多少个字符串
  47. COUNT(*) over(PARTITION by IndexArr) as split_str_count
  48. from tb t
  49. cross apply dbo.f_splitSTR(t.IndexArr,',') f
  50. )
  51. select t.ID,
  52. t.IndexArr
  53. from t
  54. where charindex(col, ','+@s+',') > 0
  55. group by t.ID,
  56. t.IndexArr,
  57. t.split_str_count
  58. having COUNT(*) = t.split_str_count --比如2,34,45分拆为3个字符串,
  59. --那么在经过where条件过滤后,记录数也必须是3
  60. --这样说明了indexarr中的字符串都在@s变量中出现了

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

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

  1. 在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)

    原文:在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

  2. Flutter 中的常见的按钮组件 以及自定义按钮组件

    Flutter 里有很多的 Button 组件很多,常见的按钮组件有:RaisedButton.FlatButton. IconButton.OutlineButton.ButtonBar.Float ...

  3. Flutter AspectRatio、Card 卡片组件

    Flutter AspectRatio 组件 AspectRatio 的作用是根据设置调整子元素 child 的宽高比. AspectRatio 首先会在布局限制条件允许的范围内尽可能的扩展,widg ...

  4. 按钮显示隐藏div、input等

    <script type="text/javascript"> function show() { var value = document.getElementByI ...

  5. [转]3D渲染管线

    转自:http://tgerm.org/SRP/ 在3D中有两种渲染管线,分别是图形渲染管线和GPU渲染管线. 图形渲染管线 <Render-Time Rendering Third Editi ...

  6. ubuntu挂载新硬盘

    root@luo-All-Series:~# fdisk -lDisk /dev/loop0: 320.2 MiB, 335728640 bytes, 655720 sectorsUnits: sec ...

  7. 深入学习c++--lambda函数

    1. 简单使用 #include <iostream> #include <functional> using namespace std; struct Print { vo ...

  8. nginx调优(一)

    (1).隐藏nginx版本号 隐藏版本号可以有效避免黑客根据nginx版本信息,查找对应漏洞进行攻击. 下载nginx源码包(http://nginx.org/en/download.html)并上传 ...

  9. 【python基础】使用import导入相对路径的源文件

    前言 在编写python代码的过程中,不同路径下的源码文件该如何引用,这是个问题,本文针对这个问题介绍解决方法. 源码目录结构: . ├── conf.py ├── main.py ├── mod/ ...

  10. 【Leetcode_easy】942. DI String Match

    problem 942. DI String Match 参考 1. Leetcode_easy_942. DI String Match; 完