做信息发布时,会要求选择此条信息的关键字,用如下方法实现[align=center][/align]当点击确定时,会形成如下关键字“汽机分场,锅炉分场,热工分场,停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 ..........................................";请高人指点!多谢了!!

解决方案 »

  1.   

    strring getKeywords = "汽机分场,热工分场,停1号机,停5号机,停公用系统,停循环水系统";把这个拆分成一个关键字表
    KEY然后再和你的原表关联查询 LIKE 
      

  2.   

    发一个拆分的例子
    --> 测试数据: #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
    */