Case insensitive searching in Oracle
有可能让他们不区分大小写吗?
在不使用全文索引的情况下,在Oracle中执行不区分大小写的搜索有三种主要方法。
最终,您选择的方法取决于您的个人情况;要记住的一点是,为了提高性能,您必须正确索引以进行不区分大小写的搜索。
1。将列和字符串大小写相同。您可以使用
1 | SELECT * FROM my_table WHERE UPPER(column_1) = UPPER('my_string'); |
或
1 | SELECT * FROM my_table WHERE LOWER(column_1) = LOWER('my_string'); |
如果
1 | CREATE INDEX my_index ON my_table ( LOWER(column_1) ); |
如果使用like,则必须将
1 | SELECT * FROM my_table WHERE LOWER(column_1) LIKE LOWER('my_string') || '%'; |
这个SQL助手演示了在所有这些查询中会发生什么。请注意解释计划,它指示何时使用索引,何时不使用索引。
2。使用正则表达式。从Oracle 10g起,提供
为了将其用作相等运算符,必须指定字符串的开始和结束,该字符串由克拉和美元符号表示。
1 | SELECT * FROM my_table WHERE regexp_like(column_1, '^my_string$', 'i'); |
为了执行类似的操作,可以删除这些内容。
1 | SELECT * FROM my_table WHERE regexp_like(column_1, 'my_string', 'i'); |
注意这一点,因为字符串可能包含正则表达式引擎将以不同方式解释的字符。
除了使用regexp ou like()之外,此sql fiddle向您显示相同的示例输出。
三。在会话级别更改它。nls-sort参数控制排序的排序顺序和各种比较运算符,包括
1 | ALTER SESSION SET nls_sort=BINARY_CI |
如果你想指定一种不同的语言,或者使用二进制搜索来进行不区分重音的搜索,那么关于语言排序和字符串搜索还有很多额外的信息。
您还需要更改nls_comp参数;以引用:
The exact operators and query clauses that obey the NLS_SORT parameter
depend on the value of the NLS_COMP parameter. If an operator or
clause does not obey the NLS_SORT value, as determined by NLS_COMP,
the collation used is BINARY.
nls_comp的默认值是二进制的;但是,language指定Oracle应注意nls_sort的值:
Comparisons for all SQL operations in the WHERE clause and in PL/SQL
blocks should use the linguistic sort specified in the NLS_SORT
parameter. To improve the performance, you can also define a
linguistic index on the column for which you want linguistic
comparisons.
因此,再一次,您需要更改会话
1 | ALTER SESSION SET nls_comp=LINGUISTIC |
如文档中所述,您可能希望创建一个语言索引来提高性能
1 2 | CREATE INDEX my_linguistc_index ON my_table (NLSSORT(column_1, 'NLS_SORT = BINARY_CI')); |
自10GR2以来,Oracle允许通过设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 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 |
还可以创建不区分大小写的索引:
1 2 3 4 5 6 7 8 | CREATE INDEX nlsci1_gen_person ON MY_PERSON (NLSSORT (PERSON_LAST_NAME, 'NLS_SORT=BINARY_CI') ) ; |
此信息来自Oracle不区分大小写的搜索。文章提到了
在10gr2之前的版本中,不能真正做到这一点,通常的方法是,如果不需要不区分重音的搜索,只需
也许你可以尝试使用
1 2 3 | SELECT user_name FROM user_master WHERE UPPER(user_name) LIKE '%ME%' |
从Oracle 12c r2可以使用
The COLLATE operator determines the collation for an expression. This operator enables you to override the collation that the database would have derived for the expression using standard collation derivation rules.
The COLLATE operator takes one argument, collation_name, for which you can specify a named collation or pseudo-collation. If the collation name contains a space, then you must enclose the name in double quotation marks.
演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | CREATE TABLE tab1(i INT PRIMARY KEY, name VARCHAR2(100)); INSERT INTO tab1(i, name) VALUES (1, 'John'); INSERT INTO tab1(i, name) VALUES (2, 'Joe'); INSERT INTO tab1(i, name) VALUES (3, 'Billy'); --========================================================================-- SELECT /*csv*/ * FROM tab1 WHERE name = 'jOHN' ; -- no rows selected SELECT /*csv*/ * FROM tab1 WHERE name COLLATE BINARY_CI = 'jOHN' ; /* "I","NAME" 1,"John" */ SELECT /*csv*/ * FROM tab1 WHERE name LIKE 'j%'; -- no rows selected SELECT /*csv*/ * FROM tab1 WHERE name COLLATE BINARY_CI LIKE 'j%'; /* "I","NAME" 1,"John" 2,"Joe" */ |
Db>小提琴演示
1 2 3 | SELECT user_name FROM my_table WHERE nlssort(user_name, 'NLS_SORT = Latin_CI') = nlssort('%AbC%', 'NLS_SORT = Latin_CI') |
你可以这样做:
1 | WHERE regexp_like(name, 'string$', 'i'); |