我现在有个Comments字段,数据类型是nvarchar(500)我想要的效果就是只要Comments字段包含我的词语就查询出来,如下:
select * from table WHERE CONTAINS(Comments,'"红楼梦"')
但是我现在有若干个词语,比如: 红楼梦,一帘幽梦,蝴蝶飞飞,雨蝶,水浒传,西游记,三国演义,笑傲江湖 等等
我要的结果是只要Comments字段包含我的若干个词语3个以上就要,我试了用sql实现不了,估计要用存储过程去处理,请大家帮忙写下。谢谢!(查询数据有20万左右,要求效率执行高)  

解决方案 »

  1.   

    declare @s varchar(1000),@sql varchar(8000)
    set @s='红楼梦,一帘幽梦,蝴蝶飞飞,雨蝶,水浒传,西游记,三国演义,笑傲江湖'
    set @s='select '''+replace(@s,',',''' as col union all select ''')+''''set @sql='select a.Comments
    from [table] a,
    (select * from ('+@s+') t ) b
    WHERE charindex(b.col,a.Comments)>0
    group by a.Comments
    having count(1)>=3'--print @sqlexec (@sql)
      

  2.   

    如果还要显示其他字段,在set @sql='select a.Comments 后面加,并加到group by后面
      

  3.   

    1楼的方法可以实现,但是有个问题,效率很低,我在20万数据中查询top 1000 都要 3 秒
    能不能把 select '红楼梦' as col 这样的组合方式改成效率高的。谢谢!解决立刻结贴!
      

  4.   

    /*
    名称:fn_split函数.
    功能:实现字符串分隔功能的函数
    */
    create function dbo.fn_split(@inputstr varchar(8000), @seprator varchar(10))
    returns @temp table (a varchar(200))
    as 
    begin
      declare @i int
      set @inputstr = rtrim(ltrim(@inputstr))
      set @i = charindex(@seprator , @inputstr)
      while @i >= 1
      begin
        insert @temp values(left(@inputstr , @i - 1))
        set @inputstr = substring(@inputstr , @i + 1 , len(@inputstr) - @i)
        set @i = charindex(@seprator , @inputstr)
      end
      if @inputstr <> '\'
      insert @temp values(@inputstr)
      return 
    end
    go
    declare @s varchar(1000),@sql varchar(8000)
    set @s='红楼梦,一帘幽梦,蝴蝶飞飞,雨蝶,水浒传,西游记,三国演义,笑傲江湖'select a.Comments
    from [table] a,dbo.fn_split(@s,',') b
    WHERE charindex(b.col,a.Comments)>0
    group by a.Comments
    having count(1)>=3
    这种查询效率比较难提高,用函数试试效率会不会高一点
      

  5.   

    select a.Comments
    from [table] a,dbo.fn_split(@s,',') b
    WHERE charindex(b.col,a.Comments)>0
    group by a.Comments
    having count(1)>=3这里的 b.col 不对吧,这个函数中没有col哦
      

  6.   

    declare @s varchar(1000),@sql varchar(8000)
    set @s='红楼梦,一帘幽梦,蝴蝶飞飞,雨蝶,水浒传,西游记,三国演义,笑傲江湖'
    --select * from dbo.fn_split(@s,',')select a.Comments
    from [table] a,dbo.fn_split(@s,',') b
    WHERE charindex(b.a,a.Comments)>0
    group by a.Comments
    having count(1)>=3
      

  7.   

    效率是个问题,既然用了全文,可以拼成类似如下语句
    select * from table WHERE CONTAINS(Comments,'"红楼梦" OR "一帘幽梦" OR "蝴蝶飞飞" OR "雨蝶" OR "水浒传" OR "西游记" OR "三国演义" OR "笑傲江湖') 
      

  8.   

    select * into #a from table WHERE CONTAINS(Comments,'红楼梦') 
    select * into #b from table WHERE CONTAINS(Comments,'三国演义') 
    select * into #c from table WHERE CONTAINS(Comments,'雨蝶') 
    ........
    新建一个表为bb字段为:标识列加table表中的所有列
    在把#a,#b,#c表中内容追加到bb表中,最后按table表关键字分组查询bb表内容,每组条数大于3(count(*)>=3)的记录就是.