LIKE
およびその他の比較演算子=
などのデフォルトの動作では、大文字と小文字が区別されます。
大文字と小文字を区別しないようにすることは可能ですか?
REGEXP_LIKE(username,'me','i')
LIKEの代わりに使用することを検討しましたか?
LIKE
およびその他の比較演算子=
などのデフォルトの動作では、大文字と小文字が区別されます。
大文字と小文字を区別しないようにすることは可能ですか?
REGEXP_LIKE(username,'me','i')
LIKEの代わりに使用することを検討しましたか?
回答:
10gR2以降、Oracleでは、NLS_COMP
およびNLS_SORT
パラメータを設定することにより、文字列比較の動作を微調整できます。
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')
)
;
この情報は、Oracleの大文字と小文字を区別しない検索から取得されました。記事は言及してREGEXP_LIKE
いますが、古き良き=
ものでも動作するようです。
10gR2より古いバージョンでは実際には実行できません。アクセント記号を区別しない検索が必要でない場合、通常のアプローチUPPER()
は列と検索式の両方を使用することです。
LIKE
式(例:)WHERE foo LIKE '%abc%'
は、インデックス化できない場合はすでに十分に遅く、大文字と小文字の区別に特に関係があるとは思われません。
DBD::Oracle
書き込むことができます$ENV{NLS_SORT} = 'BINARY_CI'; $ENV{NLS_COMP} = 'LINGUISTIC';
。
ALTER SESSION
、修正のローカルインスタンスを変更するだけで、現在のセッションのように、つまり、いったん閉じて再び開くとリセットされます。現在の値が何であるかを確認できる方法はありますか?それがどこにでも保持されている場合、元の設定に戻すことができます...
フルテキストインデックスを使用せずにOracleで大文字と小文字を区別しない検索を実行するには、主に3つの方法があります。
最終的にどの方法を選択するかは、個々の状況によって異なります。覚えておくべき主なことは、パフォーマンスを向上させるには、大文字と小文字を区別しない検索のために正しくインデックスを付ける必要があるということです。
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 Fiddleは、これらすべてのクエリで何が起こるかを示しています。インデックスがいつ使用され、いつ使用されないかを示すExplain Planに注意してください。
Oracle 10g以降 REGEXP_LIKE()
が利用可能です。'i'
大文字と小文字を区別しない検索を実行するために、_match_parameter_を指定できます。
これを等価演算子として使用するには、文字列の開始と終了を指定する必要があります。これは、カラットとドル記号で示されます。
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');
ストリングには正規表現エンジンによって異なる解釈がされる文字が含まれている可能性があるため、これには注意してください。
このSQLフィドルは、REGEXP_LIKE()を使用することを除いて、同じ出力例を示しています。
NLS_SORTのパラメータは、発注を含む様々な比較演算子のための照合順序支配=
とLIKEを。セッションを変更することにより、大文字と小文字を区別せずにバイナリを指定できます。つまり、そのセッションで実行されるすべてのクエリは、大文字と小文字を区別しないパラメーターを実行します。
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'));
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
代わり にやるのがなぜ違うのか尋ねてもいい select * from my_table where lower(column_1) LIKE lower('my_string%');
ですか?メリットはありますか?
regexp_like
ような文字列をエスケープする方法はありますか?たとえば、文字列に$が含まれている場合、出力は期待したものとは異なります。// cc @Benと他の人が共有してください。
多分あなたは使用してみることができます
SELECT user_name
FROM user_master
WHERE upper(user_name) LIKE '%ME%'
WHERE upper(user_name) LIKE UPPER('%ME%')
それについて考えましたか?:)
UPPER
入力パラメーターにも使用しないのですか?
upper
インデックスを失う関数を使用していますが、インデックスを使用して検索を行う方法はありますか?
Oracle 12c R2から次のように使用できますCOLLATE operator
。
COLLATE演算子は、式の照合を決定します。この演算子を使用すると、標準の照合導出ルールを使用して、データベースが式に対して導出した照合をオーバーライドできます。
COLLATE演算子は引数としてcollation_nameを1つ取り、名前付き照合または疑似照合を指定できます。照合名にスペースが含まれている場合は、名前を二重引用符で囲む必要があります。
デモ:
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"
*/
select user_name
from my_table
where nlssort(user_name, 'NLS_SORT = Latin_CI') = nlssort('%AbC%', 'NLS_SORT = Latin_CI')
%
2番目の最初の引数でのがNLSSORT
されていない権利、ワイルドカードであることを意図しますか?彼らはちょっと混乱しています。