搜索关键字,按空格分开,结果要按精确度从高到低显示,比如:
查找的关键字---> 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个关键字
/*---------------------------------
-- Author : htl258(Tony)
-- Date : 2009-09-14 09:59:47
-- Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
Mar 29 2009 10:27:29
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
---------------------------------*/
--> 生成测试数据表:tb
IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([ID] INT,[CONTENT] NVARCHAR(40))
INSERT [tb]
SELECT 1,N'JAVA是面对对象的语言' UNION ALL
SELECT 2,N'PHP学起来比JAVA要容易点' UNION ALL
SELECT 3,N'ASP比PHP用起来简单,PHP比JAVA用起来简单' UNION ALL
SELECT 4,N'FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用' UNION ALL
SELECT 5,N'ASP,PHP用来做网页都不错'
GO
--SELECT * FROM [tb]
-->SQL查询如下:
--
IF NOT OBJECT_ID('[fn_px]') IS NULL
DROP FUNCTION [fn_px]
GO
CREATE FUNCTION fn_px(@CONTENT NVARCHAR(100),@str NVARCHAR(100))
RETURNS INT
AS
BEGIN
DECLARE @t TABLE(col NVARCHAR(50))
DECLARE @r int
SET @str=RTRIM(LTRIM(@str))+CHAR(32)
WHILE LEN(@str)>0
BEGIN
INSERT @t SELECT LEFT(@str,CHARINDEX(CHAR(32),@str)-1)
SET @str=STUFF(@str,1,CHARINDEX(CHAR(32),@str),'')
END
SELECT @r=SUM(CASE WHEN CHARINDEX(col,@CONTENT)>0 THEN 1 ELSE 0 END) FROM @t
RETURN @r
END
GO
--调用函数查询如下:
DECLARE @str NVARCHAR(100)
SET @str='ASP JAVA PHP FLEX '
SELECT * FROM tb ORDER BY dbo.fn_px(CONTENT,@str) DESC,ID
--结果:
/*
ID CONTENT
----------- ----------------------------------------
4 FLEX做出来的界面好漂亮,而且可以和ASP,PHP,JAVA结合使用
3 ASP比PHP用起来简单,PHP比JAVA用起来简单
2 PHP学起来比JAVA要容易点
5 ASP,PHP用来做网页都不错
1 JAVA是面对对象的语言
(5 行受影响)
*/