滨_Notepad

学习工作点滴积累
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一个简单的搜索的实现

Posted on 2007-12-17 20:30  新人~  阅读(337)  评论(0编辑  收藏  举报

比如有个字段tag存储了多个预先设置的标签,现在要找出与输入匹配的记录,输入的字符串为多个空格分割的字符串组成
比如:输入字符串为 “HP 惠普   2008  笔记本”,要求能找出tag字段中所有包含 HP 或 笔记本 。。。。的记录
就是类似于简单的搜索引擎实现

SELECT tag
  
FROM product
 
WHERE REGEXP_LIKE (tag,
                    
REPLACE (UPPER (fn_compress_space (inputstr)), ' ',
                             
's*|')
                   );
其中 fn_compress_space 是一个将多个连续空格压缩成单个空格的函数:
CREATE OR REPLACE FUNCTION fn_compress_space (p_str IN VARCHAR2)
/**//*
将一个字符串中的多个连续空格或tab符号格式化成单个半角空格的字符串
*/

RETURN VARCHAR2
IS
   
len      INT             := 0;
   str1     
VARCHAR2 (2000);
   str2     
VARCHAR2 (4);
   str3     
VARCHAR2 (4)    := 'a';
   strout   
VARCHAR2 (2000);
BEGIN
-- 把全角的空格和tab符、半角的tab符都转化成半角空格
   str1 :=
        
REPLACE (REPLACE (REPLACE (p_str, ' '' '), '    '' '), ' '' ');
   
len := LENGTH (str1);

   
FOR i IN 1 .. len
   LOOP
      str2 :
= SUBSTR (str1, i, 1);

      
IF str2 != ' '
      
THEN
         strout :
= strout || str2;
      ELSIF str3 
!= ' '
      
THEN
         strout :
= strout || str2;
      
END IF;

      str3 :
= str2;
   
END LOOP;

   
RETURN TRIM (strout);
END fn_compress_space;
/

以上代码为Oracle语言,希望既熟悉Oracle又熟悉SQL的高手写一个SQL版的!