美好的一天,
我的客户使用最初为MSSQL设计的应用程序,默认情况下可能会执行不区分大小写的搜索。但客户使用Oracle,因此需要一些额外的调整。
所以问题是:如何告诉Oracle使用给定的SELECT LIKE-Statement搜索不区分大小写,并具有以下限制?
我知道在系统级别设置NLS_SORT的可能性,但这基本上会破坏性能,因为所有索引都被禁用。
答案 0 :(得分:1)
您可以使用DBMS_ADVANCED_REWRITE将SQL重写为不区分大小写的版本。
稍微更改这样的查询可能会令人困惑,并且可能会使故障排除和调整变得困难。该软件包还有一些限制,可能使其不切实际,例如不支持绑定变量。
<强> 1。示例模式
SQL> drop table test1;
Table dropped.
SQL> create table test1(a varchar2(100));
Table created.
SQL> insert into test1 values ('case INSENSITIVE');
1 row created.
SQL> commit;
Commit complete.
<强> 2。该查询最初区分大小写,并匹配0行
SQL> select count(*) total from test1 where a like '%case insensitive%';
TOTAL
----------
0
第3。创建重写等效 - 添加LOWER
函数
SQL> begin
2 sys.dbms_advanced_rewrite.declare_rewrite_equivalence(
3 name => 'case_insensitive_1',
4 source_stmt => q'[select count(*) total from test1 where a like '%case insensitive%']',
5 destination_stmt => q'[select count(*) total from test1 where lower(a) like '%case insensitive%']',
6 validate => false
7 );
8 end;
9 /
PL/SQL procedure successfully completed.
<强> 4。现在,相同的查询不区分大小写,并匹配1行
SQL> alter session set query_rewrite_integrity = trusted;
Session altered.
SQL> select count(*) total from test1 where a like '%case insensitive%';
TOTAL
----------
1