パターン一致条件
パターン一致条件は文字データを比較します。
LIKE条件
LIKE条件は、パターン一致を含むかどうかをテストします。等号演算子(=)は、ある文字値を別の文字値と一致させますが、LIKE条件は、ある文字値の一部を別の文字値と一致させます(ある値が指定したパターンの検索を、もう一方の値に対して行います)。LIKEは入力文字セットで定義された文字を使用して、文字列を計算します。LIKECは、完全なUnicodeキャラクタを使用します。LIKE2は、UCS2コードポイントを使用します。LIKE4は、UCS4コードポイントを使用します。
like_condition::=
この構文は、次の特長があります。
-
char1は、キャラクタ列などの文字式で、検索値と呼ばれます。 -
char2は、通常はリテラルの文字式で、パターンと呼ばれます。 -
esc_charは、通常はリテラルの文字式で、エスケープ文字と呼ばれます。
LIKE条件は、ほぼすべての場合において最適な選択です。次のガイドラインを使用して、ご使用の環境に有効な例を判断してください。
-
LIKE2を使用して、UCS-2セマンティクスで文字列を処理します。LIKE2は、Unicode補助文字を2文字として扱います。 -
LIKE4を使用して、UCS-4セマンティクスで文字列を処理します。LIKE4は、Unicode補助文字を1文字として扱います。 -
LIKECを使用して、完全なUnicodeキャラクタ・セマンティクスで文字列を処理します。LIKECは、複合文字を1文字として扱います。
esc_charが指定されていない場合、デフォルトのエスケープ文字はありません。char1、char2またはesc_charのいずれかがNULLである場合、結果は不明になります。それ以外の場合は、エスケープ文字(指定されている場合)は、長さが1の文字列です。
すべての文字式(char1、char2およびesc_char)は、CHAR、VARCHAR2、NCHARまたはNVARCHAR2データ型です。文字式のデータ型が異なる場合、Oracleはすべての文字式をchar1のデータ型に変換します。
パターンは、特殊パターン一致文字を含むことができます。
-
パターン中のアンダースコア(_)は、値の中の1文字(マルチバイトの文字セットでの1バイトとは異なる)に置き換えることができます。
-
パターン中のパーセント記号(%)は、値の中の0(ゼロ)を含む任意の数の文字(マルチバイトの文字セットでの1バイトとは異なる)に置き換えることができます。ただし、パターン「%」は、NULLに置き換えることはできません。
エスケープ文字を識別するESCAPE句を使用すると、パターン中に%または_を実際の文字として含めることができます。エスケープ文字がパターンの中で文字%または_の前に指定されている場合、Oracleは、この文字を特殊パターン一致文字としてではなく、リテラル文字として解析します。また、エスケープ文字自体を検索する場合は、その文字を続けて入力してください。たとえば、アットマーク(@)がエスケープ文字である場合、@@を使用してアットマーク(@)を検索できます。
ノート:
ASCII表記のアンダースコア(_)およびパーセント(%)文字のみが、パターン一致文字として認識されます。東アジア文字セットおよびUnicodeで表示される全角文字は、通常の文字として扱われます。
表6-8に、LIKE条件を示します。
表6-8 LIKE条件
| 条件の種類 | 操作 | 例 |
|---|---|---|
x [NOT] LIKE y [ESCAPE 'z'] |
|
SELECT last_name FROM employees WHERE last_name LIKE '%A\_B%' ESCAPE '\' ORDER BY last_name; |
LIKE条件を処理するために、Oracleは、パターンを1つまたは2つの文字で構成されるサブパターンに分割します。2文字のサブパターンは、エスケープ文字で始まり、もう1つの文字はパーセント(%)、アンダースコア(_)またはエスケープ文字です。
P1、P2、...、Pnを、このようなサブパターンと想定します。1からnのすべてのiにおいて、次の条件を満たすように検索値を部分文字列S1、S2、...、Snに分割できる場合、LIKE条件はTRUEです。
-
Piがアンダースコア(_)の場合、Siは単一文字である。
-
Piがパーセント(%)の場合、Siは任意の文字列である。
-
Piがエスケープ文字で始まる2文字の場合、SiはPiの2番目の文字である。
-
それ以外の場合、PiとSiは一致する。
LIKE条件では、値を定数ではなくパターンと比較できます。必ずLIKEキーワードの直後に、パターンを指定してください。たとえば、次の問合せを発行することによって、名前がRで始まるすべての従業員の給与を検索できます。
SELECT salary
FROM employees
WHERE last_name LIKE 'R%'
ORDER BY salary;
次の問合せは、LIKE条件ではなく=演算子を使用しているため、名前が「R%」のすべての従業員の給与が検索されます。
SELECT salary
FROM employees
WHERE last_name = 'R%'
ORDER BY salary;
次の問合せでは、名前が「SM%」のすべての従業員の給与が検索されます。この場合、'SM%'がLIKEキーワードの前にあるため、Oracleは、'SM%'をパターンとしてではなく、テキスト・リテラルとして解析します。
SELECT salary
FROM employees
WHERE 'SM%' LIKE last_name
ORDER BY salary;照合および大/小文字の区別
LIKE条件は照合依存です。Oracle Databaseにおいて、前述の処理アルゴリズムでは、サブパターンPiがサブストリングSiと比較され、そのとき、char1とchar2の導出照合から決定された照合が使用されます。この照合で大/小文字が区別されない場合は、パターン一致でも大/小文字が区別されません。
関連項目:
大/小文字またはアクセントを区別しない照合およびLIKE条件の照合決定ルールの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
索引列でのパターン一致
LIKEを使用して索引列をパターン検索する場合、パターンの先頭文字が%または_でなければ、Oracleは索引を利用して問合せのパフォーマンスを向上させることができます。この場合、Oracleはこの先頭文字によって索引をスキャンできます。パターンの先頭文字が%または_の場合、Oracleは索引をスキャンできないため、パフォーマンスは向上しません。
LIKE条件: 一般的な例
次の条件は、Maで始まるすべてのlast_name値でtrueです。
last_name LIKE 'Ma%'
次のすべてのlast_name値では、条件がtrueになります。
Mallin, Markle, Marlow, Marvins, Mavris, Matos
大文字と小文字が区別されるため、MA、ma、mAで始まるlast_name値では条件がfalseになります。
次のような条件があるとします。
last_name LIKE 'SMITH_'
この条件は、次のlast_name値でtrueです。
SMITHE, SMITHY, SMITHS
特殊文字であるアンダースコア(_)は、last_name値の1つの文字に置き換えることができるため、この条件は「SMITH」についてFALSE(偽)となります。
ESCAPE句の例
次の例では、名前のパターンがA_Bである従業員を検索します。
SELECT last_name
FROM employees
WHERE last_name LIKE '%A\_B%' ESCAPE '\'
ORDER BY last_name;
ESCAPE句は、エスケープ文字としてバックスラッシュ(\)を識別します。パターンの中でエスケープ文字はアンダースコア(_)に先行します。これによって、Oracleは、アンダースコアを特殊なパターン一致文字としてではなく、リテラルとして解析します。
%なしのパターンの例
パターンに%文字が含まれていない場合、条件がtrueになるのは、両方のオペランドが同じ長さである場合のみです。次の表の定義および挿入される値について考えます。
CREATE TABLE ducks (f CHAR(6), v VARCHAR2(6));
INSERT INTO ducks VALUES ('DUCK', 'DUCK');
SELECT '*'||f||'*' "char",
'*'||v||'*' "varchar"
FROM ducks;
char varchar
-------- --------
*DUCK * *DUCK*
Oracleは、CHAR値に空白埋めを行うため、fの値は空白埋めによって6バイトになります。vの値は空白埋めされず、4文字長のままです。
REGEXP_LIKE条件
REGEXP_LIKEはLIKE条件と似ています。ただし、REGEXP_LIKEは、単純なパターン一致を実行するLIKEとは異なり、正規表現一致を実行します。この条件は、入力文字セットによって定義された文字を使用して、文字列を評価します。
この条件は、POSIX正規表現規格およびUnicode Regular Expression Guidelinesに準拠します。詳細は、「Oracleの正規表現のサポート」を参照してください。
regexp_like_condition::=
-
source_charは、検索値として使用される文字式です。通常は文字列であり、データ型はCHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOBまたはNCLOBのいずれかです。 -
patternは正規表現です。通常はテキスト・リテラルであり、データ型はCHAR、VARCHAR2、NCHARまたはNVARCHAR2のいずれかになります。ここには、 512バイトまで入力できます。patternのデータ型がsource_charのデータ型と異なる場合、Oracleはpatternをsource_charのデータ型に変換します。patternで指定できる演算子のリストは、「Oracleの正規表現のサポート」を参照してください。 -
match_paramは、データ型がVARCHAR2またはCHARの文字式であり、条件のデフォルトの照合動作を変更できます。match_paramの値には、次の文字を1つ以上含めることができます。-
'i'を指定すると、条件に対して決定されている照合が大/小文字の区別ありであっても、大/小文字の区別なしでの照合となります。 -
'c'を指定すると、条件に対して決定されている照合が大/小文字の区別なしまたはアクセントの区別なしの場合でも、大/小文字の区別あり、アクセントの区別ありでの照合となります。 -
'n': ピリオド(.)の使用を許可します。ピリオドは、改行文字を含む任意の文字と一致するワイルド・カード文字です。このパラメータを指定しない場合、ピリオドは改行文字には一致しません。 -
'm': ソース文字列を複数行として処理します。Oracleは、^および$を、それぞれ、ソース文字列全体の開始または終了としてのみではなく、ソース文字列内の任意の場所にある任意の行の開始または終了としてとして解釈します。このパラメータを指定しない場合、Oracleはソース文字列を単一行として処理します。 -
'x'は空白文字を無視します。デフォルトでは、空白文字は空白文字として一致します。
相反する文字が
match_paramの値に複数含まれている場合は、最後の文字が使用されます。たとえば、'ic'を指定した場合は、大/小文字の区別あり、アクセントの区別ありでの照合が使用されます。値に前述以外の文字が含まれている場合は、エラーが戻されます。match_paramを指定しない場合、次のようになります。-
大/小文字およびアクセントを区別するかどうかのデフォルトは、
REGEXP_LIKE条件に対して決定されている照合によって決まります。 -
ピリオド(.)は改行文字に一致しません。
-
ソース文字列は単一行として処理されます。
-
LIKE条件と同様、REGEXP_LIKE条件は照合依存です。
関連項目:
-
正規表現をサポートするファンクションについては、「REGEXP_INSTR」、「REGEXP_REPLACE」および「REGEXP_SUBSTR」を参照してください。
REGEXP_LIKE条件の照合決定ルールは、『Oracle Databaseグローバリゼーション・サポート・ガイド』の付録Cを参照してください。
例
次の問合せは、名前がStevenまたはStephenである(first_nameがSteで始まってenで終わり、間がvまたはphがある)従業員の姓と名を戻します。
SELECT first_name, last_name FROM employees WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$') ORDER BY first_name, last_name; FIRST_NAME LAST_NAME -------------------- ------------------------- Steven King Steven Markle Stephen Stiles
次の問合せは、姓に母音を2つ含む(大文字か小文字にかかわらず、last_nameでa、e、i、oまたはuのいずれかが2つ連続している)従業員の姓を戻します。
SELECT last_name FROM employees WHERE REGEXP_LIKE (last_name, '([aeiou])\1', 'i') ORDER BY last_name; LAST_NAME ------------------------- De Haan Greenberg Khoo Gee Greene Lee Bloom Feeney

