多条件查询 sql的写法

tiger8000 2012-02-14 01:51:30
做信息发布时,会要求选择此条信息的关键字,用如下方法实现





当点击确定时,会形成如下关键字

“汽机分场,锅炉分场,热工分场,停1号机,停5号机,停6号机,停3号炉,停4号炉,停公用系统,停循环水系统,停工业水系统”

或者是没有选中 “停止” 的 checkbox 时会生成如下

“汽机分场,锅炉分场,热工分场,1号机,5号机,6号机,3号炉,4号炉,公用系统,循环水系统,工业水系统”

然后,将上面生成的关键字存入数据库表 Defects 中的字段 KeyWords

---------------------------------------------------------

当做信息查询时,同样弹出以上那个关键字对话框,取得查询字符串,当然取得的关键字形式跟当初录入信息产生关键字方法是一样的。
比如,查询时取得的关键字也是这样的

“汽机分场,热工分场,停1号机,停5号机,停公用系统,停循环水系统”

那现在我的问题就是,这样的查询 sql语句要如何写呢?

比如:

strring getKeywords = "汽机分场,热工分场,停1号机,停5号机,停公用系统,停循环水系统";
string sqlSearch = "select Defects where ..........................................";

请高人指点!多谢了!!
...全文
87 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tiger8000 2012-02-14
看来是我的设计 思路有问题,我应该把最开始存入数据库的关键字拆分 然后,存入一张单独表里

是不是应该这样比较好?
回复
tiger8000 2012-02-14
看来是我的设计 思路有问题,我应该把最形如存入数据库的关键字拆分 然后,存入一张单独表里
回复
小_爱 2012-02-14
发一个拆分的例子




--> 测试数据: #T
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (id int,name varchar(8))
insert into #T
select 1,'jame,job' union all
select 2,'paul,mc' union all
select 3,'carl';

--> 1. CTE 递归找分隔字符位置法:速度极快
with T (id,P1,P2) as
(
select id,charindex(',',','+name),charindex(',',name+',')+1 from #T
union all
select a.id,b.P2,charindex(',',name+',',b.P2)+1 from #T a join T b on a.id=b.id where charindex(',',name+',',b.P2)>0
)
select a.id,name=substring(a.name+',',b.P1,b.P2 - b.P1 - 1) from #T a join T b on a.id=b.id order by 1
/*
id name
----------- ---------
1 jame
1 job
2 mc
2 paul
3 carl
*/
--> 测试数据: #T
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (id int,name varchar(8))
insert into #T
select 1,'jame,job' union all
select 2,'paul,mc' union all
select 3,'carl';

--> 2. 临时表法:速度比CTE方法相差无几
if object_id('tempdb.dbo.#') is not null drop table #
select top 8000 id=identity(int,1,1) into # from syscolumns,sysobjects --> select max(len(name)) from #T=11
select a.id,name=substring(a.name+',',b.id,charindex(',',a.name+',',b.id+1)-b.id) from #T a inner join # b on substring(','+a.name,b.id,1)=','
/*
id name
----------- ---------
1 jame
1 job
2 mc
2 paul
3 carl
*/

3. XML法:速度较慢
select
a.id,b.name
from
(select id,name=convert(xml,'<root><v>'+replace(name,',','</v><v>')+'</v></root>') from #T ) a
outer apply
(select name=N.v.value('.','varchar(100)') from a.name.nodes('/root/v') N(v)) b
/*
id name
----------- ---------
1 jame
1 job
2 mc
2 paul
3 carl
*/
回复
小_爱 2012-02-14
你是逗号隔开存了一坨

然后在逗号隔开查询?

我的神啊。。。。

把查询条件 如汽机分场,热工分场,停1号机,停5号机,停公用系统,停循环水系统 分拆到一个临时表中 然后
关联你的表走查询。
回复
SQL77 2012-02-14
strring getKeywords = "汽机分场,热工分场,停1号机,停5号机,停公用系统,停循环水系统";

把这个拆分成一个关键字表
KEY

然后再和你的原表关联查询 LIKE
回复
没看明白真么意思
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2012-02-14 01:51
社区公告
暂无公告