oracle 10g需要用到模糊匹配的功能,使Oracle对字符串的大小写不敏感。目前想到的几个解决方案:0。alter session。 不现实,而且用了这个就会全表搜索,超慢。1。lower(name) like lower('%$name$%')。 性能太低2。在1的基础上建立函数索引。 治标不治本,说不定性能更低
再次请教各位大大,有没有更好的办法解决此问题。

解决方案 »

  1.   

    先用正则表达式试试SELECT * FROM DUAL WHERE regexp_like('abcde','bc','i');
    SELECT * FROM DUAL WHERE regexp_like('aBcde','bc','i');
    SELECT * FROM DUAL WHERE regexp_like('abcde','Bc','i');
    SELECT * FROM DUAL WHERE regexp_like('abcde','Bc','c');第三个参数'i'或'c'表示对大小写是否敏感,'i'表示不敏感,'c'表示敏感关于正则表达式详见
    http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#i1010949
      

  2.   

    增加一个字段还不如用lower或者upper函数
      

  3.   

    首先,这根传输数据量没什么关系,你可以只把这个字段作为检索条件,不让他出现在select子句。
    其次,其实这个做法也就是变相的函数索引,所以我认为你还是建立函数索引试验一下。
    至于正则表达式是否能够提高效率,我持观望态度。
      

  4.   


    举个例子CREATE TABLE strs (str VARCHAR2(10));
    INSERT INTO strs VALUES('ABCD');
    INSERT INTO strs VALUES('AbCD');
    INSERT INTO strs VALUES('ABcD');
    INSERT INTO strs VALUES('AbcD');
    commit;SELECT * FROM strs WHERE regexp_like(str,'bc','i');
    SELECT * FROM strs WHERE regexp_like(str,'Bc','i');SELECT * FROM strs WHERE regexp_like(str,'bc','c');
    SELECT * FROM strs WHERE regexp_like(str,'Bc','c');
      

  5.   

    正则如何能提高效率?
    4楼的解法似乎会比lower更低效。
      

  6.   

    暂时使用lower(),再建函数索引oracle怎么能这样
      

  7.   


    为什么"似乎会比lower更低效",能解释一下吗?
      

  8.   

    走头吴路可以用:inter Media。
    不过建索引函数还是首选啊!
      

  9.   

    是滴是滴,又不是perl,据俺估计oracle实现正则的目的是简便而不是效率。
    不过大家是不是把问题扯远了,这个问题核心是执行计划的优化,而不是函数执行速度的比较。
    大家说说自己的观点吧,
    我觉得正路是对函数建立索引。