表结构如下,根据keys这一列查询
name | keys |
张三 | a,b,c |
李四 | a,c,d,e |
王五 | c,f |
查询字符串str=a,e,g;
查询结果显示:张三,李四,这两行,即keys这一列的数据跟str有交集的数据都返回,求sql语句
你需要的是修改数据表结构,这结构你找谁来也没用。一定慢得半死。
z怎么改好点呢,给个建议
@狼性法则:
name | keys |
张三 | a |
张三 | b |
张三 | c |
李四 | c |
select * from table where CHARINDEX('a', keys)>0 union select * from table where CHARINDEX('e', keys)>0 union select * from table where CHARINDEX('g', keys)>0
拆分一下str拼成这样 虽然比较low 但是能满足你的需求
包含查询呢
(包含"a") or (包含"e") or (包含"g") ,因为你的str是逗号隔开的只能这么查,要是str=a 这种就直接(包含"a")就行
declare @temp2 table ( aaa varchar(10) ) while(charindex(',',@str)>0) begin insert into @temp2(aaa) select SUBSTRING(@str,charindex(',',@str)-1,1); set @str=SUBSTRING(@str,charindex(',',@str)+1,LEN(@str)) end insert into @temp2(aaa) select @str select a.name,a.keys from @temp a where exists(select aaa from @temp2 where CHARINDEX(aaa,a.keys)>0)
原生的SQL和SQL SERVER内置函数基本都搞不定你的需求。
你可能需要在数据库中先编写一个自定义的函数,用于判断两个字符串按相同规则各自拆分成的集合是否有交集。
然后在你的SQL语句的WHERE中调用这个函数。
select * from yourtable where Fun(keys , 'a,e,g') ;
请问这个Fun()怎么实现呢???
请问楼主问题解决了没有?想请教一下