在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)
原文:在论坛中出现的比较难的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.函数
-
if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')
-
drop function dbo.f_splitSTR
-
go
-
-
create function dbo.f_splitSTR
-
(
-
@s varchar(8000), --要分拆的字符串
-
@split varchar(10) --分隔字符
-
)
-
returns @re table( --要返回的临时表
-
col varchar(1000) --临时表中的列
-
)
-
as
-
begin
-
declare @len int
-
-
set @len = LEN(@split) --分隔符不一定就是一个字符,可能是2个字符
-
-
while CHARINDEX(@split,@s) >0
-
begin
-
insert into @re
-
values(left(@s,charindex(@split,@s) - 1))
-
-
set @s = STUFF(@s,1,charindex(@split,@s) - 1 + @len ,'') --覆盖:字符串以及分隔符
-
end
-
-
insert into @re values(@s)
-
-
return --返回临时表
-
end
-
go
-
-
-
-
--> 测试数据:[tb]
-
if object_id('[tb]') is not null
-
drop table [tb]
-
go
-
-
create table [tb]([ID] int,[IndexArr] varchar(19))
-
insert [tb]
-
select 1,'1,2,3,4,5' union all
-
select 2,'55,6,99,87,1000' union all
-
select 3,'7,567567,567,43,123' union ALL
-
SELECT 4,'2,34,45'
-
-
-
-
--------------开始查询--------------------------
-
DECLARE @s VARCHAR(1000)
-
-
SET @s= '2,34,45,345,867,4,984'
-
-
-
;with t
-
as
-
(
-
select t.ID,
-
t.IndexArr,
-
f.col,
-
-
--把IndexArr按照分隔符,拆分成了多少个字符串
-
COUNT(*) over(PARTITION by IndexArr) as split_str_count
-
from tb t
-
cross apply dbo.f_splitSTR(t.IndexArr,',') f
-
)
-
-
select t.ID,
-
t.IndexArr
-
from t
-
where charindex(col, ','+@s+',') > 0
-
group by t.ID,
-
t.IndexArr,
-
t.split_str_count
-
having COUNT(*) = t.split_str_count --比如2,34,45分拆为3个字符串,
-
--那么在经过where条件过滤后,记录数也必须是3
-
--这样说明了indexarr中的字符串都在@s变量中出现了
-
在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)的更多相关文章
- 在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)
原文:在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)
原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)
原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- https://docs.huihoo.com/infoq/qconbeijing/2016/day1/工程效率提升专题/2-2-支持百度万人开发的工具装备及百度工程能力建设-夏仲璞.pdf
https://docs.huihoo.com/infoq/qconbeijing/2016/day1/工程效率提升专题/2-2-支持百度万人开发的工具装备及百度工程能力建设-夏仲璞.pdf http ...
- deepin常用软件列表
deepin常用软件列表 软件列表 Safe Eyes 视力保护程序 网址
- 000 vue各种基本指令
一:vue实例 1.实例 新建项目: 2.程序 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- Information:java: Multiple encodings set for module chunk platf "GBK" will be used by compile
转自:https://blog.csdn.net/xiaobing_122613/article/details/81866445 Intellij IDEA 在引入代码后,出现编译错误. Infor ...
- java连接数据库失败:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
说一下我的情况: 在测试环境中运行没有任何问题,但是导出war包之后,就将war包上传到线上服务器的webapps目录下,然后启动Tomcat,等待Tomcat将上传的war包解压(此时Tomcat没 ...
- Qt编写自定义控件62-探探雷达
一.前言 随着移动互联网的盛行,现在手机APP大行其道,每个人的手机没有十几个APP都不好意思说自己是现代人,各种聊天.购物.直播.小视频等APP,有个陌生人社交的APP叫探探,本人用过几次,当然不是 ...
- 123457123456#2#----com.MCgame.ShuXueKoSuan98--前拼后广--儿童小学数学口算Game-mc22222
com.MCgame.ShuXueKoSuan98--前拼后广--儿童小学数学口算Game-mc
- 【mysql】添加删除权限
https://www.cnblogs.com/wuxunyan/p/9095016.html
- Dockerfile-server1
[root@lab2 docker-file]# cd server1/ [root@lab2 server1]# ls a.sh ddbes-server1-0.0.1-SNAPSHOT.jar D ...
- 解决no module named setuptools
To install setuptools on Debian: sudo apt-get install python-setuptools For Python 3.x: sudo apt-get ...