Sql Oracle中不区分大小写的搜索
Sql Oracle中不区分大小写的搜索,sql,oracle,case-sensitive,case-insensitive,sql-like,Sql,Oracle,Case Sensitive,Case Insensitive,Sql Like,LIKE和其他比较运算符=etc的默认行为区分大小写 是否可以使它们不区分大小写?也许您可以尝试使用 SELECT user_name FROM user_master WHERE upper(user_name) LIKE '%ME%' 自10gR2以来,Oracle允许通过设置和会话参数来微调字符串比较的行为: SQL> SET HEADING OFF SQL> SELECT * 2 FROM NLS_SESSION_PARAMETERS 3 WHERE PARAM
LIKE
和其他比较运算符=
etc的默认行为区分大小写
是否可以使它们不区分大小写?也许您可以尝试使用
SELECT user_name
FROM user_master
WHERE upper(user_name) LIKE '%ME%'
自10gR2以来,Oracle允许通过设置和会话参数来微调字符串比较的行为:
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
您还可以创建不区分大小写的索引:
create index
nlsci1_gen_person
on
MY_PERSON
(NLSSORT
(PERSON_LAST_NAME, 'NLS_SORT=BINARY_CI')
)
;
这一信息来自于。这篇文章提到了REGEXP\u LIKE
,但它似乎也适用于好的老=
在早于10gR2的版本中,这是无法实现的,如果不需要不区分重音的搜索,通常的方法是只
UPPER()
列和搜索表达式。在Oracle中执行不区分大小写的搜索,而不使用全文索引
select user_name
from my_table
where nlssort(user_name, 'NLS_SORT = Latin_CI') = nlssort('%AbC%', 'NLS_SORT = Latin_CI')
最终你选择什么方法取决于你的个人情况;要记住的主要一点是,为了提高性能,必须为不区分大小写的搜索建立正确的索引
1.列和字符串的大小写相同。
通过使用或,您可以强制所有数据都是相同的情况:
或
如果column\u 1
未在上部(column\u 1)
或下部(column\u 1)
上建立索引(视情况而定),这可能会强制进行全表扫描。为了避免这种情况,您可以创建一个
如果使用LIKE,则必须在搜索的字符串周围串联一个%
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
演示在所有这些查询中发生的情况。请注意解释计划,它指示何时使用索引以及何时不使用索引
2.使用正则表达式。
从Oracle 10g开始提供。为了执行不区分大小写的搜索,可以指定_match_参数'i'
为了将其用作相等运算符,必须指定字符串的开始和结束,该字符串由克拉和美元符号表示
select * from my_table where regexp_like(column_1, '^my_string$', 'i');
为了执行类似的操作,可以将其移除
select * from my_table where regexp_like(column_1, 'my_string', 'i');
注意这一点,因为您的字符串可能包含正则表达式引擎将以不同方式解释的字符
除了使用REGEXP_LIKE()之外,显示了相同的示例输出
3.在会话级别更改它。
该参数控制排序的排序顺序和各种比较运算符,包括=
等。您可以通过更改会话来指定不区分大小写的二进制排序。这意味着在该会话中执行的每个查询都将执行不区分大小写的参数
alter session set nls_sort=BINARY_CI
如果您想指定不同的语言,或者使用BINARY_AI进行不区分重音的搜索,那么还有大量的附加信息
您还需要更改参数;引述:
符合NLS_排序参数的精确运算符和查询子句
取决于NLS_COMP参数的值。如果操作员或
子句不符合NLS_COMP确定的NLS_排序值,
使用的排序规则是二进制的
NLS_COMP的默认值为二进制;但是,语言学规定Oracle应注意NLS_排序的价值:
WHERE子句和PL/SQL中所有SQL操作的比较
块应使用NLS_排序中指定的语言排序
参数为了提高性能,还可以定义
要为其创建语言索引的列上的语言索引
比较
因此,您需要再次更改会话
alter session set nls_comp=LINGUISTIC
如文档中所述,您可能希望创建一个
create index my_linguistc_index on my_table
(NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));
你可以这样做:
where regexp_like(name, 'string$', 'i');
从Oracle 12c R2中,您可以使用: COLLATE运算符确定表达式的排序规则。此运算符使您能够覆盖数据库将使用标准排序规则派生表达式的排序规则。 COLLATE运算符接受一个参数collation\u name,您可以为其指定命名排序规则或伪排序规则。如果排序规则名称包含空格,则必须用双引号将名称括起来 演示:
当输入参数是整个大写字母时,它就起作用了,如果是小写字母或混合字母,它就不起作用了。
您考虑过大写字母(用户名)像大写字母(“%ME%”)的位置吗?:)@sergionni搜索词也必须大写@sergionni,那你为什么不在输入参数上也使用UPPER
?@V4Vendetta使用UPPER
函数你失去了索引,你知道如何使用索引进行搜索吗?“创建基于函数的索引”令人惊讶的是,这会有多大的不同?我可以问一下,为什么从我的表格中选择*会有不同吗?在我的表格中,较低的(列1)与较低的('my_string')| |'%'
而不是从my_表中选择*,其中lower(列_1)与lower类似(“my_字符串%”)代码>?它有什么好处吗?一个原因是如果您的查询是参数化的(可能在大多数情况下),那么您的调用代码不需要总是在@lopezvit结尾连接一个%。如果有一些字符会弄乱regexp\u like
的结果,有没有办法转义这些字符串?举个例子,如果字符串有$,那么输出将与我们期望的不同//cc@Ben和其他人请分享。`
@bozzmob。如果正则表达式正在操作的字符串包含$
,则输出应该没有差异,这只会在正则表达式中需要$
文本时导致问题。如果你有一个特定的问题,如果这个评论/回答没有帮助,我会问另一个问题。这很有效,但是使用LIKE/=操作符的更新速度非常慢(@SaqibAliLIKE
表达式(例如其中foo-LIKE“%abc%”
)如果无法索引,则速度已经足够慢,我不知道
alter session set nls_comp=LINGUISTIC
create index my_linguistc_index on my_table
(NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));
where regexp_like(name, 'string$', 'i');
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"
*/