搜索关键字,按空格分开,结果要按精确度从高到低显示,比如:
查找的关键字---> 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。求解!!
查找的关键字---> 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。求解!!
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
然后再来操作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;
谢谢你!还有二楼的兄弟。请问用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楼。
/*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)就是精确度。
因为关键词数量不定,5楼大哥给的方法明显超出我所学的范围所以我还在纠结