Oracle中不区分大小写的search
LIKE和其他比较运算符=
的缺省行为是区分大小写的。
是否有可能使它们不区分大小写?
从10gR2起,Oracle允许通过设置NLS_COMP
和NLS_SORT
会话参数来微调string比较的行为:
SQL> SET HEADING OFF SQL> SELECT * 2 FROM NLS_SESSION_PARAMETERS 3 WHERE PARAMETER IN ('NLS_COMP', 'NLS_SORT'); NLS_SORT BINARY NLS_COMP BINARY SQL> SQL> SELECT CASE WHEN 'abc'='ABC' THEN 1 ELSE 0 END AS GOT_MATCH 2 FROM DUAL; 0 SQL> SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC; Session altered. SQL> ALTER SESSION SET NLS_SORT=BINARY_CI; Session altered. SQL> SQL> SELECT * 2 FROM NLS_SESSION_PARAMETERS 3 WHERE PARAMETER IN ('NLS_COMP', 'NLS_SORT'); NLS_SORT BINARY_CI NLS_COMP LINGUISTIC SQL> SQL> SELECT CASE WHEN 'abc'='ABC' THEN 1 ELSE 0 END AS GOT_MATCH 2 FROM DUAL; 1
您还可以创build不区分大小写的索引:
create index nlsci1_gen_person on MY_PERSON (NLSSORT (PERSON_LAST_NAME, 'NLS_SORT=BINARY_CI') ) ;
这些信息取自Oracle不区分大小写的search 。 这篇文章提到了REGEXP_LIKE
但是它似乎也适用于老的=
。
在比10gR2更早的版本中,如果不需要重音不敏感的search,则无法真正完成,而通常的方法就是将列和searchexpression式都设为UPPER()
。
在不使用全文索引的情况下,有三种主要的方法可以在Oracle中执行不区分大小写的search。
最终你select什么方法取决于你的个人情况。 要记住的主要是要提高性能,您必须正确索引不区分大小写的search。
1.一致地列出你的专栏和你的string。
您可以使用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)
upper(column_1)
没有索引,则可能会强制进行全表扫描。 为了避免这种情况,你可以创build一个基于函数的索引 。
create index my_index on my_table ( lower(column_1) );
如果你使用LIKE,那么你必须连接你正在search的string周围的%
。
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
这个SQL Fiddle演示了在所有这些查询中发生的事情。 请注意解释计划,它表明索引何时被使用,何时不被使用。
2.使用正则expression式。
从Oracle 10g起, REGEXP_LIKE()
可用。 您可以指定_match_parameter_'i 'i'
,以执行不区分大小写的search。
为了将其用作平等运算符,您必须指定string的开始和结束,该string由克拉和美元符号表示。
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');
请小心,因为您的string可能包含正则expression式引擎将解释不同的字符。
除了使用REGEXP_LIKE()之外, 这个SQL Fiddle显示了相同的示例输出。
3.在会话级别更改它。
NLS_SORT参数控制sorting和各种比较运算符(包括=
和LIKE)的sorting顺序。 您可以指定一个二进制,不区分大小写,通过更改会话进行sorting。 这将意味着在该会话中执行的每个查询都将执行不区分大小写的参数。
alter session set nls_sort=BINARY_CI
如果您想要指定不同的语言,或者使用BINARY_AI进行不区分重音的search,则会有大量有关语言sorting和stringsearch的附加信息。
您还需要更改NLS_COMP参数; 去引用:
服从NLS_SORT参数的确切运算符和查询子句取决于NLS_COMP参数的值。 如果运算符或子句不符合由NLS_COMP确定的NLS_SORT值,则使用的sorting规则是BINARY。
NLS_COMP的默认值是BINARY; 但是,LINGUISTIC指定Oracle应该注意NLS_SORT的值:
WHERE子句和PL / SQL块中的所有SQL操作的比较应使用NLS_SORT参数中指定的语言sorting。 为了提高性能,还可以在要进行语言比较的列上定义语言索引。
所以,再一次,你需要改变会议
alter session set nls_comp=LINGUISTIC
如文档中所述,您可能需要创build一个语言索引来提高性能
create index my_linguistc_index on my_table (NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));
也许你可以尝试使用
SELECT user_name FROM user_master WHERE upper(user_name) LIKE '%ME%'
select user_name from my_table where nlssort(user_name, 'NLS_SORT = Latin_CI') = nlssort('%AbC%', 'NLS_SORT = Latin_CI')
你可以做这样的事情:
where regexp_like(name, 'string$', 'i');