3 回答

TA貢獻2016條經驗 獲得超9個贊
在不使用全文索引的情況下,有三種主要方法可以在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)
視情況而定,則可能會強制進行全表掃描。為了避免這種情況,您可以創建基于函數的索引。
create index my_index on my_table ( lower(column_1) );
如果你正在使用LIKE,那么你必須連接%
你正在搜索的字符串。
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
這個SQL小提琴演示了所有這些查詢中發生的事情。請注意解釋計劃,它指示何時使用索引以及何時使用索引。
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');
請注意這一點,因為您的字符串可能包含正則表達式引擎將以不同方式解釋的字符。
除了使用REGEXP_LIKE()之外,此SQL Fiddle顯示相同的示例輸出。
3.在會話級別更改它。
所述NLS_SORT參數控制訂購歸類序列和各種比較運算符,包括=
和類似物。您可以通過更改會話來指定二進制,不區分大小寫,排序。這意味著在該會話中執行的每個查詢都將執行不區分大小寫的參數。
alter session set nls_sort=BINARY_CI
如果您想指定不同的語言,或者使用BINARY_AI進行重音不敏感搜索,那么有很多關于語言排序和字符串搜索的附加信息。
您還需要更改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
如文檔中所述,您可能需要創建語言索引以提高性能
create index my_linguistc_index on my_table (NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));

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