3 回答

TA貢獻(xiàn)2016條經(jīng)驗 獲得超9個贊
在不使用全文索引的情況下,有三種主要方法可以在Oracle中執(zhí)行不區(qū)分大小寫的搜索。
最終,您選擇的方法取決于您的個人情況; 要記住的主要事情是,為了提高性能,您必須正確索引以進(jìn)行不區(qū)分大小寫的搜索。
1.對你的專欄和你的字符串進(jìn)行相同的處理。
您可以使用UPPER()
或強制所有數(shù)據(jù)都是相同的大小寫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)
視情況而定,則可能會強制進(jìn)行全表掃描。為了避免這種情況,您可以創(chuàng)建基于函數(shù)的索引。
create index my_index on my_table ( lower(column_1) );
如果你正在使用LIKE,那么你必須連接%
你正在搜索的字符串。
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
這個SQL小提琴演示了所有這些查詢中發(fā)生的事情。請注意解釋計劃,它指示何時使用索引以及何時使用索引。
2.使用正則表達(dá)式。
從Oracle 10g起REGEXP_LIKE()
可用。您可以指定_match_parameter_ 'i'
,以便執(zhí)行不區(qū)分大小寫的搜索。
要將此作為相等運算符使用,必須指定字符串的開頭和結(jié)尾,用克拉和美元符號表示。
select * from my_table where regexp_like(column_1, '^my_string$', 'i');
為了執(zhí)行LIKE的等效,可以刪除這些。
select * from my_table where regexp_like(column_1, 'my_string', 'i');
請注意這一點,因為您的字符串可能包含正則表達(dá)式引擎將以不同方式解釋的字符。
除了使用REGEXP_LIKE()之外,此SQL Fiddle顯示相同的示例輸出。
3.在會話級別更改它。
所述NLS_SORT參數(shù)控制訂購歸類序列和各種比較運算符,包括=
和類似物。您可以通過更改會話來指定二進(jìn)制,不區(qū)分大小寫,排序。這意味著在該會話中執(zhí)行的每個查詢都將執(zhí)行不區(qū)分大小寫的參數(shù)。
alter session set nls_sort=BINARY_CI
如果您想指定不同的語言,或者使用BINARY_AI進(jìn)行重音不敏感搜索,那么有很多關(guān)于語言排序和字符串搜索的附加信息。
您還需要更改NLS_COMP參數(shù); 報價:
遵循NLS_SORT參數(shù)的確切運算符和查詢子句取決于NLS_COMP參數(shù)的值。如果運算符或子句不遵循由NLS_COMP確定的NLS_SORT值,則使用的排序規(guī)則是BINARY。
NLS_COMP的默認(rèn)值是BINARY; 但是,LINGUISTIC指定Oracle應(yīng)該注意NLS_SORT的值:
WHERE子句和PL / SQL塊中所有SQL操作的比較應(yīng)使用NLS_SORT參數(shù)中指定的語言排序。要提高性能,您還可以在要進(jìn)行語言比較的列上定義語言索引。
所以,再一次,你需要改變會話
alter session set nls_comp=LINGUISTIC
如文檔中所述,您可能需要創(chuàng)建語言索引以提高性能
create index my_linguistc_index on my_table (NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));

TA貢獻(xiàn)1828條經(jīng)驗 獲得超4個贊
也許你可以嘗試使用
SELECT user_nameFROM user_masterWHERE upper(user_name) LIKE '%ME%'
添加回答
舉報