フルテキストインデックスを使用せずにOracleで大文字と小文字を区別しない検索を実行するには、主に3つの方法があります。
最終的に、どの方法を選択するかは、個々の状況によって異なります。覚えておくべき主なことは、パフォーマンスを向上させるには、大文字と小文字を区別しない検索のために正しくインデックスを作成する必要があるということです。
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') || '%';
このSQLFiddleは、これらすべてのクエリで何が起こるかを示しています。インデックスが使用されている場合と使用されていない場合を示す説明プランに注意してください。
2。正規表現を使用します。
Oracle10g以降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');
文字列には正規表現エンジンによって異なる解釈が行われる文字が含まれている可能性があるため、これには注意してください。
このSQLFiddleは、REGEXP_LIKE()を使用する以外は同じ出力例を示しています。
3。セッションレベルで変更します。
NLS_SORTパラメーターは、順序付けの照合シーケンスと、=
を含むさまざまな比較演算子を管理します。 とLIKE。セッションを変更することにより、大文字と小文字を区別しないバイナリの並べ替えを指定できます。これは、そのセッションで実行されるすべてのクエリが大文字と小文字を区別しないパラメータを実行することを意味します。
alter session set nls_sort=BINARY_CI
別の言語を指定したい場合、またはBINARY_AIを使用してアクセントに依存しない検索を実行したい場合は、言語の並べ替えと文字列検索に関する追加情報がたくさんあります。
また、NLS_COMPパラメーターを変更する必要があります。引用する:
NLS_SORTパラメーターに従う正確な演算子とクエリ句は、NLS_COMPパラメーターの値によって異なります。演算子orclauseがNLS_COMPによって決定されたNLS_SORT値に従わない場合、使用される照合はBINARYです。
NLS_COMPのデフォルト値はBINARYです。ただし、LINGUISTICは、OracleがNLS_SORTの値に注意を払う必要があることを指定しています。
WHERE句とPL/SQLblockでのすべてのSQL操作の比較では、NLS_SORTパラメータで指定された言語ソートを使用する必要があります。パフォーマンスを向上させるために、言語比較が必要な列に言語インデックスを定義することもできます。
したがって、もう一度、セッションを変更する必要があります
alter session set nls_comp=LINGUISTIC
ドキュメントに記載されているように、パフォーマンスを向上させるために言語インデックスを作成することをお勧めします
create index my_linguistc_index on my_table
(NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));