搜索关键字,按空格分开,结果要按精确度从高到低显示,比如:
查找的关键字---> ASP JAVA PHP FLEX
数据库记录集---> ID CONTENT
 1 JAVA是面对对象的语言
 2 PHP学起来比JAVA要容易点
 3 ASP比PHP用起来简单,PHP比JAVA用起来简单
 4 FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用
 5 ASP,PHP用来做网页都不错那么搜索的结果排序应该是
 ID   
  4 -->出现了4个关键字
  3 -->出现了3个关键字
  2 -->出现了2个关键字
  5 -->出现了2个关键字  
  1 -->出现了1个关键字
这是别人在MS-SQL出的题,跟我的问题一摸一样,但是看不太懂ms sql。求解!!  

解决方案 »

  1.   

    with a as(
    select 1 id,'JAVA是面对对象的语言' content from dual
    union all
    select 2 id,'PHP学起来比JAVA要容易点 ' content from dual
    union all
    select 3 id,'ASP比PHP用起来简单,PHP比JAVA用起来简单' content from dual
    union all
    select 4 id,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用' content from dual
    union all
    select 5 id,'ASP,PHP用来做网页都不错' content from dual
    )
    select id || '-->' || '出现了' || num ||'个关键字' from(
    select id,sum((case when instr(content,'ASP') > 0 then 1 else 0 end))
    + sum((case when instr(content,'JAVA') > 0 then 1 else 0 end))
    + sum((case when instr(content,'PHP') > 0 then 1 else 0 end))
    + sum((case when instr(content,'FLEX') > 0 then 1 else 0 end)) num
    from a group by id
    ) order by num desc
      

  2.   

    http://topic.csdn.net/u/20090914/09/7594dc12-cc25-44b5-ab4f-6b6e9a979f92.html原帖地址。谢谢大家!
      

  3.   

    可是如果搜索关键词个数不固定呢?用JDBC开发的。关键词之间用空格分割。
      

  4.   

    你可以先将这些关键字分割到一个表里 
    然后再来操作with a as(
    select 1 id,'JAVA是面对对象的语言' content from dual
    union all
    select 2 id,'PHP学起来比JAVA要容易点 ' content from dual
    union all
    select 3 id,'ASP比PHP用起来简单,PHP比JAVA用起来简单' content from dual
    union all
    select 4 id,'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用' content from dual
    union all
    select 5 id,'ASP,PHP用来做网页都不错' content from dual
    ),
    b as(--这个b表就是存放关键字的表
    select 'JAVA' content from dual union all
    select 'PHP' from dual union all
    select 'ASP' from dual union all
    select 'FLEX'  from dual)
    select id || '-->' || '出现了' ||cnt||'个关键字' name
    from(select id,sum((case when instr(a.content,b.content)>0 then 1 else 0 end)) cnt
    from a,b
    group by a.id)
    order by cnt descNAME
    -------------------------
    4-->出现了4个关键字
    3-->出现了3个关键字
    2-->出现了2个关键字
    5-->出现了2个关键字
    1-->出现了1个关键字
    --提供个类似 分割关键字 存储到表中的函数
    --函数的功能 将传入的字符串(a,bdc,fde,23,rd,sasp)拆分放到一个表a里
    create or replace procedure testpro(v_str varchar2)
    as
    sqlstr varchar2(4000);
    v_sqlstr varchar2(4000);
    begin
    v_sqlstr:=','||v_str||',';
    sqlstr:='insert into a
    select
    substr('''||v_sqlstr||''',instr('''||v_sqlstr||''','','',1,rownum)+1,
            instr('''||v_sqlstr||''','','',1,rownum+1)-
            instr('''||v_sqlstr||''','','',1,rownum)-1) newid
    from dual
    connect by rownum <= length('''||v_sqlstr||''')
         - length(replace('''||v_sqlstr||''', '','', ''''))-1';
    execute immediate sqlstr;
    --dbms_output.put_line(sqlstr);
    end;
      

  5.   


    谢谢你!还有二楼的兄弟。请问用oracle能写出累死SELECT * FROM @tb AS A
    ORDER BY 
       (SELECT COUNT(*)
        FROM (
            SELECT B.x.value('.','varchar(50)') AS s
            FROM (SELECT CONVERT(xml,'<v>'+REPLACE(@str,' ','</v><v>')+'</v>') AS s) AS T
               CROSS APPLY T.s.nodes('//v') AS B(x)) AS T
        WHERE CHARINDEX(s,A.CONTENT) > 0) DESC这样的代码么?
    Via http://topic.csdn.net/u/20090914/09/7594dc12-cc25-44b5-ab4f-6b6e9a979f92.html   9楼。
      

  6.   

    对content创建全文检索:预备工作:
    /*1、使用具有sysdba权限的用户登录/ 
    grant connect,resource to tls4cs; 
    grant ctxapp to tls4cs; 
    alter user tls4cs default role all;/*2、通常ctxsys处于锁定状态,需要解锁ctxsys用户/ 
    alter user ctxsys account unlock;/*3、对象权限/ 
    grant execute on ctx_ddl to tls4cs;
    开始工作:1、建一个中文词法分析器:
    ctx_ddl.create_preference ('my_lexer', 'chinese_lexer');2、然后建立索引CREATE INDEX myindex ON YourTable(content) indextype is ctxsys.context parameters('lexer my_lexer');
    3、进行查询
       select * from YourTable where contains(content,'ASP or JAVA or PHP or FLEX)>0 order by score(1) desc  可以查到记录.score(1)就是精确度。
      

  7.   

    补充,其实检索内容是英文的,然后我想在java程序里提交给sql进行搜索,返回搜索结果。
    因为关键词数量不定,5楼大哥给的方法明显超出我所学的范围所以我还在纠结