先用正则表达式试试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
举个例子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');
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
其次,其实这个做法也就是变相的函数索引,所以我认为你还是建立函数索引试验一下。
至于正则表达式是否能够提高效率,我持观望态度。
举个例子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');
4楼的解法似乎会比lower更低效。
为什么"似乎会比lower更低效",能解释一下吗?
不过建索引函数还是首选啊!
不过大家是不是把问题扯远了,这个问题核心是执行计划的优化,而不是函数执行速度的比较。
大家说说自己的观点吧,
我觉得正路是对函数建立索引。