在不使用全文索引的情况下,有 3 种主要方法可以在 Oracle 中执行不区分大小写的搜索。
最终选择哪种方法取决于您的个人情况;要记住的主要事情是,为了提高性能,您必须正确索引以进行不区分大小写的搜索。
1。大小写相同的列和字符串。
您可以使用UPPER() 或LOWER() 强制所有数据大小写相同:
select * from my_table where upper(column_1) = upper('my_string');
或
select * from my_table where lower(column_1) = lower('my_string');
如果column_1 未在upper(column_1) 或lower(column_1) 上建立索引,则可能会强制执行全表扫描。为了避免这种情况,您可以创建一个function-based index。
create index my_index on my_table ( lower(column_1) );
如果您使用 LIKE,则必须在要搜索的字符串周围连接一个 %。
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
This SQL Fiddle 演示了所有这些查询中发生的情况。请注意解释计划,它指示何时使用索引,何时不使用。
2。使用正则表达式。
从 Oracle 10g 开始,REGEXP_LIKE() 可用。您可以指定_match_parameter_'i',以执行不区分大小写的搜索。
为了将其用作等式运算符,您必须指定字符串的开始和结束,用克拉和美元符号表示。
select * from my_table where regexp_like(column_1, '^my_string$', 'i');
为了执行 LIKE 的等效操作,可以删除这些。
select * from my_table where regexp_like(column_1, 'my_string', 'i');
请注意这一点,因为您的字符串可能包含正则表达式引擎会以不同方式解释的字符。
This SQL Fiddle 向您显示相同的示例输出,但使用 REGEXP_LIKE()。
3。在会话级别更改它。
NLS_SORT 参数控制排序的排序规则和各种比较运算符,包括 = 和 LIKE。您可以通过更改会话来指定二进制、不区分大小写的排序。这意味着在该会话中执行的每个查询都将执行不区分大小写的参数。
alter session set nls_sort=BINARY_CI
如果您想指定不同的语言,或使用 BINARY_AI 进行不区分重音的搜索,还有很多关于 linguistic sorting and string searching 的附加信息。
您还需要更改NLS_COMP 参数;引用:
遵循 NLS_SORT 参数的确切运算符和查询子句
取决于 NLS_COMP 参数的值。如果操作员或
子句不服从由 NLS_COMP 确定的 NLS_SORT 值,
使用的排序规则是 BINARY。
NLS_COMP 的默认值为 BINARY;但是,LINGUISTIC 规定 Oracle 应该注意 NLS_SORT 的值:
WHERE 子句和 PL/SQL 中所有 SQL 操作的比较
块应使用 NLS_SORT 中指定的语言排序
范围。为了提高性能,您还可以定义一个
您想要语言的列上的语言索引
比较。
所以,再一次,您需要更改会话
alter session set nls_comp=LINGUISTIC
如文档中所述,您可能需要创建 linguistic index 以提高性能
create index my_linguistc_index on my_table
(NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));