在不使用全文索引的情况下,可以通过3种主要方法在Oracle中执行不区分大小写的搜索。
最终,您选择哪种方法取决于您的个人情况。要记住的主要事情是,为了提高性能,必须为不区分大小写的搜索正确地建立索引。
1.将列和字符串的大小写相同。
您可以使用UPPER()或强制所有数据都使用相同的大小写LOWER():
select*frommy_tablewhereupper(column_1)=upper('my_string');
要么
select*frommy_tablewherelower(column_1)=lower('my_string');
如果column_1未在upper(column_1)或上建立索引lower(column_1),则可能会强制执行全表扫描。为了避免这种情况,您可以创建基于函数的index。
createindexmy_indexonmy_table(lower(column_1));
如果您使用的是LIKE,则必须在%要搜索的字符串周围连接一个。
select*frommy_tablewherelower(column_1)LIKElower('my_string')||'%';
此SQL Fiddle演示了所有这些查询中发生的情况。注意说明计划,该计划指示何时使用索引,何时不使用索引。
2.使用正则表达式。
从Oracle 10g开始REGEXP_LIKE()可用。您可以指定_match_parameter_ 'i',以执行不区分大小写的搜索。
为了将其用作相等运算符,您必须指定字符串的开始和结束,以克拉和美元符号表示。
select*frommy_tablewhereregexp_like(column_1,'^my_string$','i');
为了执行等效的LIKE,可以将其删除。
select*frommy_tablewhereregexp_like(column_1,'my_string','i');
请注意这一点,因为您的字符串可能包含正则表达式引擎将以不同的方式解释的字符。
除了使用REGEXP_LIKE()之外,此SQL Fiddle还显示了相同的示例输出。
3.在会话级别进行更改。
所述NLS_SORT参数控制为排序和各种比较运算符,包括归类序列=和类似物。您可以通过更改会话来指定不区分大小写的二进制排序。这意味着在该会话中执行的每个查询都将执行不区分大小写的参数。
altersessionsetnls_sort=BINARY_CI
如果要指定其他语言,或者要使用BINARY_AI进行不区分重音的搜索,则还有很多其他信息与语言排序和字符串搜索有关。
您还需要更改NLS_COMP参数。报价:
服从NLS_SORT参数的确切运算符和查询子句取决于NLS_COMP参数的值。如果运算符或子句不遵循NLS_COMP确定的NLS_SORT值,则使用的归类为BINARY。
NLS_COMP的默认值为BINARY;但是,LINGUISTIC指定Oracle应该注意NLS_SORT的值:
WHERE子句和PL / SQL块中所有SQL操作的比较应使用NLS_SORT参数中指定的语言排序。为了提高性能,您还可以在要进行语言比较的列上定义语言索引。
因此,再次,您需要更改会话
altersessionsetnls_comp=LINGUISTIC
如文档中所述,您可能需要创建语言索引以提高性能
createindexmy_linguistc_indexonmy_table(NLSSORT(column_1,'NLS_SORT = BINARY_CI'));