Oracle全文检索查询及特殊字符处理查询

全文检索的建立:

1、开启全文检索查询权限。

解锁:

ALTER USER CTXSYS ACCOUNT UNLOCK;

角色授权:

GRANT CTXAPP TO xxx;

2、创建文本解析器,默认使用chinese_vgram_lexer。

BEGIN

  ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');

END;

3、创建对应的表字段全文索引。

CREATE INDEX ier_sys_user_zl ON sys_user(zl) INDEXTYPE  IS  CTXSYS.CONTEXT PARAMETERS ('LEXER my_lexer SYNC (ON COMMIT)'); 

一般我们语句为:  select * from sys_user where contains(zl,'北京')>0  即可查询出我们需要的。

但是有时候会碰到一些特殊Oracle自带的特殊字符:-()&"*%等,就会报错或者查不到想要的内容。

我们也是想了一些办法,最终通过建立函数的方式,先对查询的字符处理下,例如:北京-西门,就会处理成北京\-西门,才能得到我们要查询的内容。

函数如下:

注意下:目前针对&符号还没有测试。

create or replace function pro_replace_char(v_str varchar2) return varchar2 is
v_res varchar2(2000);
begin
  v_res:=v_str;
  for r in (
    select '-' as a from dual
    union all
    select '(' from dual
    union all
    select ')' from dual
    union all
    select '&' from dual
    union all
    select '"' from dual
    union all
    select '*' from dual
    union all
    select '%' from dual
    ) loop
    v_res:=replace(v_res,r.a,'\'||r.a);
    end loop;
  return v_res;
  end pro_replace_char;

然后我们的语句得加上这个函数就不会执行报错或者查不到想要的内容了。  

select * from sys_user where contains(zl,pro_replace_char('北京-西门'))>0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值