比如有个字段tag存储了多个预先设置的标签,现在要找出与输入匹配的记录,输入的字符串为多个空格分割的字符串组成
比如:输入字符串为 “HP 惠普 2008 笔记本”,要求能找出tag字段中所有包含 HP 或 笔记本 。。。。的记录
就是类似于简单的搜索引擎实现
SELECT tag
FROM product
WHERE REGEXP_LIKE (tag,
REPLACE (UPPER (fn_compress_space (inputstr)), ' ',
's*|')
);
其中 fn_compress_space 是一个将多个连续空格压缩成单个空格的函数:
FROM product
WHERE REGEXP_LIKE (tag,
REPLACE (UPPER (fn_compress_space (inputstr)), ' ',
's*|')
);
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;
/
/**//*
将一个字符串中的多个连续空格或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版的!