在论坛中出现的比较难的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(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- bat和cmd文件是什么,dos又是什么东西
bat文件是dos下的批处理文件.批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用cm ...
- javaweb--Rest访问(RestTemplate)
Rest访问(RestTemplate)在实际的项目中,往往需要发送一个Get/Post请求到其他的系统(Rest API),比如向人员管理部门请求,然后解析返回信息获取该用户的基本信息等.JDK传统 ...
- YII2 composer update 报错解决一例-requires bower-asset/jquery 2.2
➜ yii-advanced composer update Loading composer repositories with package information Updating depe ...
- ubuntu18设置root账号的开机登录
date: 2019-08-20 17:36:49 author: headsen chen notice :个人原创 1,用普通用户登录. su - root 打开终端 vi /etc/pam.d ...
- vmware配置双网卡
最近在学习使用iptables做网关服务器,即SNAT设置 我们的宿主机有两块网卡,地址分别是: 192.168.6.108/24 192.168.66.119/24 我们的目标是在虚拟机VMware ...
- 【转载】 clusterdata-2011-2 谷歌集群数据分析(三)
原文地址: https://blog.csdn.net/yangss123/article/details/78306270 由于原文声明其原创文章不得允许不可转载,故这里没有转载其正文内容. --- ...
- 1. Tomcat之startup.sh
#判断操作系统os400=falsecase "`uname`" inOS400*) os400=true;;esac # 取脚本名称PRG="$0" # 判断 ...
- 基于ZooKeeper实现简单的服务注册于发现
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Shaun_luotao/article/ ...
- 改进初学者的PID-微分冲击
最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...
- Go micro 开发微服务步骤
1.写 proto文件,定义接口和服务 2.实现 接口,注册 handle 3.调用服务:直接用rpc 客户端调用,或者用 api http web等调用 api http web 等服务可以对客户端 ...
