再寻高手解决字串的交集查询
时间:2011-11-22
来源:互联网
但通过实际情况,回复有问题,只能检索出相连的字串,但实际我需要的是所有被,分割的都检索
使用独立的sql语句,希望实现字符串的交集查询,比如
有一个数据表中有一个字段 s1,其中有记录如下:
ID s1
1 ,9,12,5,27,36,11,23,
2 ,8,2,34,13,5,
3 ,12,19,24,35,9,
如果输入的参数为: ,9,19,
那么将检索出数据
1 ,9,12,5,27,36,11,23,
3 ,12,19,24,35,9,
如果输入参数为:,11,5,
那么检索出数据:
1 ,9,12,5,27,36,11,23,
2 ,8,11,2,34,13,5,
如果输入参数为:,5,
那么检索出数据:
1 ,9,12,5,27,36,11,23,
2 ,8,2,34,13,5,
谢谢
作者: chilli6519 发布时间: 2011-11-22
作者: chilli6519 发布时间: 2011-11-22
作者: fredrickhu 发布时间: 2011-11-22
/****************************************************************************************************************************************************** 合并分拆表数据 整理人:中国风(Roy) 日期:2008.06.06 ******************************************************************************************************************************************************/ --> --> (Roy)生成測試數據 if not object_id('Tab') is null drop table Tab Go Create table Tab([Col1] int,[Col2] nvarchar(1)) Insert Tab select 1,N'a' union all select 1,N'b' union all select 1,N'c' union all select 2,N'd' union all select 2,N'e' union all select 3,N'f' Go 合并表: SQL2000用函数: go if object_id('F_Str') is not null drop function F_Str go create function F_Str(@Col1 int) returns nvarchar(100) as begin declare @S nvarchar(100) select @S=isnull(@S+',','')+Col2 from Tab where Col1=@Col1 return @S end go Select distinct Col1,Col2=dbo.F_Str(Col1) from Tab go SQL2005用XML: 方法1: select a.Col1,Col2=stuff(b.Col2.value('/R[1]','nvarchar(max)'),1,1,'') from (select distinct COl1 from Tab) a Cross apply (select COl2=(select N','+Col2 from Tab where Col1=a.COl1 For XML PATH(''), ROOT('R'), TYPE))b 方法2: select a.Col1,COl2=replace(b.Col2.value('/Tab[1]','nvarchar(max)'),char(44)+char(32),char(44)) from (select distinct COl1 from Tab) a cross apply (select Col2=(select COl2 from Tab where COl1=a.COl1 FOR XML AUTO, TYPE) .query(' <Tab> {for $i in /Tab[position() <last()]/@COl2 return concat(string($i),",")} {concat("",string(/Tab[last()]/@COl2))} </Tab>') )b SQL05用CTE: ;with roy as(select Col1,Col2,row=row_number()over(partition by COl1 order by COl1) from Tab) ,Roy2 as (select COl1,cast(COl2 as nvarchar(100))COl2,row from Roy where row=1 union all select a.Col1,cast(b.COl2+','+a.COl2 as nvarchar(100)),a.row from Roy a join Roy2 b on a.COl1=b.COl1 and a.row=b.row+1) select Col1,Col2 from Roy2 a where row=(select max(row) from roy where Col1=a.COl1) order by Col1 option (MAXRECURSION 0) 生成结果: /* Col1 COl2 ----------- ------------ 1 a,b,c 2 d,e 3 f (3 行受影响) */ --参考 拆分表: --> --> (Roy)生成測試數據 if not object_id('Tab') is null drop table Tab Go Create table Tab([Col1] int,[COl2] nvarchar(5)) Insert Tab select 1,N'a,b,c' union all select 2,N'd,e' union all select 3,N'f' Go --SQL2000用辅助表: if object_id('Tempdb..#Num') is not null drop table #Num go select top 100 ID=Identity(int,1,1) into #Num from syscolumns a,syscolumns b Select a.Col1,COl2=substring(a.Col2,b.ID,charindex(',',a.Col2+',',b.ID)-b.ID) from Tab a,#Num b where charindex(',',','+a.Col2,b.ID)=b.ID --也可用 substring(','+a.COl2,b.ID,1)=',' --2000不使用辅助表 Select a.Col1,COl2=substring(a.Col2,b.number,charindex(',',a.Col2+',',b.number)-b.number) from Tab a join master..spt_values b ON B.type='p' AND B.number BETWEEN 1 AND LEN(A.col2) where substring(','+a.COl2,b.number,1)=',' SQL2005用Xml: select a.COl1,b.Col2 from (select Col1,COl2=convert(xml,'<root><v>'+replace(COl2,',','</v><v>')+'</v></root>') from Tab)a outer apply (select Col2=C.v.value('.','nvarchar(100)') from a.COl2.nodes('/root/v')C(v))b SQL05用CTE: ;with roy as (select Col1,COl2=cast(left(Col2,charindex(',',Col2+',')-1) as nvarchar(100)),Split=cast(stuff(COl2+',',1,charindex(',',Col2+','),'') as nvarchar(100)) from Tab union all select Col1,COl2=cast(left(Split,charindex(',',Split)-1) as nvarchar(100)),Split= cast(stuff(Split,1,charindex(',',Split),'') as nvarchar(100)) from Roy where split>'' ) select COl1,COl2 from roy order by COl1 option (MAXRECURSION 0) 生成结果: /* Col1 COl2 ----------- ----- 1 a 1 b 1 c 2 d 2 e 3 f */
作者: fredrickhu 发布时间: 2011-11-22
--> --> (Roy)生成測試數據 if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([ID] int,[s1] nvarchar(20)) Insert #T select 1,N',9,12,5,27,36,11,23,' union all select 2,N',8,11,2,34,13,5,' union all select 3,N',12,19,24,35,9,' Go declare @str nvarchar(200) set @str=',9,19,' ;with Cte as ( select ','+SUBSTRING(@str,langid,CHARINDEX(',',@str+',',langid)-langid)+',' as Col from master.sys.syslanguages where substring(','+@str,langid,1)=',' and substring(','+@str,langid,2)not like '%,' ) Select * from #T as a where exists(select * from Cte where [s1] like '%'+Cte.Col+'%') /* ID s1 1 ,9,12,5,27,36,11,23, 3 ,12,19,24,35,9, */
作者: roy_88 发布时间: 2011-11-22
作者: chilli6519 发布时间: 2011-11-22
我的数据库是sql server 2008,但上面的回复我没有看明白
就是先拆分 然后再匹配。
作者: fredrickhu 发布时间: 2011-11-22
我的数据库是sql server 2008,但上面的回复我没有看明白
使用代码:
SQL code
declare @str nvarchar(200) set @str=',9,19,' ;with Cte as ( select ','+SUBSTRING(@str,langid,CHARINDEX(',',@str+',',langid)-langid)+',' as Col from master.sys.syslanguages where substring(','+@str,langid,1)=',' and substring(','+@str,langid,2)not like '%,' ) Select * from #T as a where exists(select * from Cte where [s1] like '%'+Cte.Col+'%')
出现错误提示:传递给left或者substring函数的长度参数无效
作者: chilli6519 发布时间: 2011-11-22
引用 5 楼 chilli6519 的回复:
我的数据库是sql server 2008,但上面的回复我没有看明白
就是先拆分 然后再匹配。
使用代码:
SQL code
declare @str nvarchar(200)
set @str=',9,19,'
;with Cte
as
(
select
','+SUBSTRING(@str,langid,CHARINDEX(',',@str+',',langid)-langid)+',' as Col
from master.sys.syslanguages
where substring(','+@str,langid,1)=','
and substring(','+@str,langid,2)not like '%,'
)
Select *
from #T as a
where exists(select * from Cte where [s1] like '%'+Cte.Col+'%')
出现错误提示:传递给left或者substring函数的长度参数无效
作者: chilli6519 发布时间: 2011-11-22
Create table tb([ID] int,[s1] nvarchar(20)) insert into tb select 1,',9,12,5,27,36,11,23,' union all select 2,',8,11,2,34,13,5,' union all select 3,',12,19,24,35,9,' Go create procedure searchtb (@str varchar(10)) as begin select * from tb a where exists(select 1 from( select substring(@str,number,charindex(',',@str,number+1)-number+1)st from master..spt_values where type='p' and number<len(@str) and substring(@str,number,1)=',' )t where charindex(st,a.s1)>0) end go exec searchtb ',9,19,' /* ID s1 ----------- -------------------- 1 ,9,12,5,27,36,11,23, 3 ,12,19,24,35,9, (2 行受影响) */ exec searchtb ',11,5,' /* ID s1 ----------- -------------------- 1 ,9,12,5,27,36,11,23, 2 ,8,11,2,34,13,5, (2 行受影响)*/ exec searchtb ',5,' /* ID s1 ----------- -------------------- 1 ,9,12,5,27,36,11,23, 2 ,8,11,2,34,13,5, (2 行受影响)*/ go drop table tb drop procedure searchtb
作者: qianjin036a 发布时间: 2011-11-22
引用 5 楼 chilli6519 的回复:
我的数据库是sql server 2008,但上面的回复我没有看明白
使用代码:
SQL code
declare @str nvarchar(200)
set @str=',9,19,'
;with Cte
as
(
select
','+SUBSTRING(@str,langid,CHARINDEX(',',@str+……
用以下試試
SQL code
--> --> (Roy)生成測試數據 if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([ID] int,[s1] nvarchar(20)) Insert #T select 1,N',9,12,5,27,36,11,23,' union all select 2,N',8,11,2,34,13,5,' union all select 3,N',12,19,24,35,9,' UNION ALL select 3,N'12' Go declare @str nvarchar(200) set @str=',9,19,' ;with Cte as ( select ','+SUBSTRING(@str,number,CHARINDEX(',',@str+',',number)-number)+',' as Col from master.dbo.spt_values where substring(','+@str,number,1)=',' and substring(','+@str,number,2)not like '%,' ) Select * from #T as a where exists(select * from Cte where [s1] like '%'+Cte.Col+'%')
作者: roy_88 发布时间: 2011-11-22
作者: roy_88 发布时间: 2011-11-22
用半角逗号
所编程序是基于你给出的数据前后都有逗号,因此要保证你的列值和送入的字符串前后都包含逗号(否则要改程序).
作者: qianjin036a 发布时间: 2011-11-22
作者: chilli6519 发布时间: 2011-11-22
SQL code
--> --> (Roy)生成測試數據 if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([ID] int,[s1] nvarchar(20)) Insert #T select 1,N',9,12,5,27,36,11,23,' union all select 2,N',8,11,2,34,13,5,' union all select 3,N',12,19,24,35,9,' UNION ALL select 3,N'12' Go declare @str nvarchar(200) set @str=',9,19,' ;with Cte as ( select ','+SUBSTRING(@str,number,CHARINDEX(',',@str+',',number)-number)+',' as Col from master.dbo.spt_values where substring(','+@str,number,1)=',' AND type='P' and substring(','+@str,number,2)not like '%,' ) Select * from #T as a where exists(select * from Cte where [s1] like '%'+Cte.Col+'%')
或用
GO
SQL code
declare @str nvarchar(200) set @str=',9,19,' SELECT * FROM #T AS c WHERE EXISTS( select 1 from (select COl2=convert(xml,'<root><v>'+replace(@str,',','</v><v>')+'</v></root>') )a CROSS apply (select Col2=C.v.value('.','nvarchar(100)') from a.COl2.nodes('/root/v')C(v))b WHERE LEN( b.Col2)>0 AND c.[s1] like '%'+b.Col2+'%')
作者: roy_88 发布时间: 2011-11-22
作者: ssp2009 发布时间: 2011-11-22
改改
SQL code
--> --> (Roy)生成測試數據
if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[s1] nvarchar(20))
Insert #T
select 1,N',9,12,5,27,36,11,23,' union all
select……
你好,改进的和第一次的是因为效率还是?谢谢
作者: chilli6519 发布时间: 2011-11-22
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28