プライマリ・コンテンツに移動
Oracle® Database SQL言語リファレンス
11gリリース2 (11.2)
B56299-08
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

パターン一致条件

パターン一致条件は文字データを比較します。

LIKE条件

LIKE条件は、パターン一致を含むかどうかをテストします。等号演算子(=)は、ある文字値を別の文字値と一致させますが、LIKE条件は、ある文字値の一部を別の文字値と一致させます(ある値が指定したパターンの検索を、もう一方の値に対して行います)。LIKEは、入力キャラクタ・セットによって定義された文字を使用して、文字列を算出します。LIKECは、完全なUnicodeキャラクタを使用します。LIKE2は、UCS2コードポイントを使用します。LIKE4は、UCS4コードポイントを使用します。

like_condition::=

like_condition.gifの説明が続きます。
図「like_condition.gif」の説明

この構文は、次の特長があります。

  • char1は、キャラクタ列などの文字式で、検索値と呼ばれます。

  • char2は、通常はリテラルの文字式で、パターンと呼ばれます。

  • esc_charは、通常はリテラルの文字式で、エスケープ文字と呼ばれます。

LIKE条件は、ほぼすべての場合において最適な選択です。次のガイドラインを使用して、ご使用の環境に有効な例を判断してください。

  • LIKE2を使用して、UCS-2セマンティクスで文字列を処理します。LIKE2は、Unicode補助文字を2文字として扱います。

  • LIKE4を使用して、UCS-4セマンティクスで文字列を処理します。LIKE4は、Unicode補助文字を1文字として扱います。

  • LIKECを使用して、完全なUnicodeキャラクタ・セマンティクスで文字列を処理します。LIKECは、複合文字を1文字として扱います。

esc_charが指定されていない場合、デフォルトのエスケープ文字はありません。char1char2またはesc_charのいずれかがNULLである場合、結果は不明になります。それ以外の場合は、エスケープ文字(指定されている場合)は、長さが1の文字列です。

すべての文字式(char1char2およびesc_char)は、CHARVARCHAR2NCHARまたはNVARCHAR2データ型です。文字式のデータ型が異なる場合、Oracleはすべての文字式をchar1のデータ型に変換します。

パターンは、特殊パターン一致文字を含むことができます。

  • パターン中のアンダースコア(_)は、値の中の1文字(マルチバイトのキャラクタ・セットでの1バイトとは異なる)に置き換えることができます。

  • パターン中のパーセント記号(%)は、値の中の0(ゼロ)を含む任意の数の文字(マルチバイトのキャラクタ・セットでの1バイトとは異なる)に置き換えることができます。ただし、パターン「%」は、NULLに置き換えることはできません。

エスケープ文字を識別するESCAPE句を使用すると、パターン中に%または_を実際の文字として含めることができます。エスケープ文字がパターンの中で文字%または_の前に指定されている場合、Oracleは、この文字を特殊パターン一致文字としてではなく、リテラル文字として解析します。また、エスケープ文字自体を検索する場合は、その文字を続けて入力してください。たとえば、アットマーク(@)がエスケープ文字である場合、@@を使用してアットマーク(@)を検索できます。


注意:

ASCII表記のアンダースコア(_)およびパーセント(%)文字のみが、パターン一致文字として認識されます。東アジア・キャラクタ・セットおよびUnicodeで表示される全角文字は、通常の文字として扱われます。

表7-8に、LIKE条件を示します。

表7-8 LIKE条件

条件の種類 操作
x [NOT] LIKE y 
[ESCAPE 'z'] 

xがパターンyに一致する場合(NOTを指定すると一致しない場合)はTRUEと評価されます。y内で、文字%は0以上のNULL以外の文字を含む文字列と一致します。文字_は、任意の1文字に一致します。パーセント(%)およびアンダースコア(_)を除く任意の文字をESCAPEの後に指定できます。ワイルド・カード文字は、エスケープ文字が前に付いている場合はリテラルとして扱われます。

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条件および等号(=)演算子を使用する文字式を比較するすべての条件において、大/小文字は区別されます。大/小文字の区別、アクセント記号の有無の区別をせずにLIKE検索をするには、NLS_SORTおよびNLS_COMPのセッション・パラメータを設定します。


関連項目:

大/小文字およびアクセント記号の有無を区別しない言語ソートの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

索引列でのパターン一致

LIKEを使用して索引列をパターン検索する場合、パターンの先頭文字が%または_でなければ、Oracleは索引を利用して問合せのパフォーマンスを向上させることができます。この場合、Oracleはこの先頭文字によって索引をスキャンできます。パターンの先頭文字が%または_の場合、Oracleは索引をスキャンできないため、パフォーマンスは向上しません。

LIKE条件: 一般的な例

次の条件は、「Ma」で始まるすべてのlast_name値についてTRUE(真)となります。

last_name LIKE 'Ma%' 

次のlast_name値はすべて、条件をTRUE(真)にします。

Mallin, Markle, Marlow, Marvins, Mavris, Matos 

大/小文字は区別されるため、MAmaおよび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_LIKELIKE条件と似ています。ただし、REGEXP_LIKEは、単純なパターン一致を実行するLIKEとは異なり、正規表現一致を実行します。この条件は、入力キャラクタ・セットによって定義された文字を使用して、文字列を評価します。

この条件は、POSIX正規表現規格およびUnicode Regular Expression Guidelinesに準拠します。詳細は、付録D「Oracleの正規表現のサポート」を参照してください。

regexp_like_condition::=

regexp_like_condition.gifの説明が続きます。
図「regexp_like_condition.gif」の説明

  • source_charは、検索値として使用される文字式です。通常は文字列であり、データ型はCHARVARCHAR2NCHARNVARCHAR2CLOBまたはNCLOBのいずれかです。

  • pattern正規表現です。通常はテキスト・リテラルであり、データ型はCHARVARCHAR2NCHARまたはNVARCHAR2のいずれかになります。ここには、 512バイトまで入力できます。patternのデータ型がsource_charのデータ型と異なる場合、Oracleはpatternsource_charのデータ型に変換します。patternで指定できる演算子のリストは、付録D「Oracleの正規表現のサポート」を参照してください。

  • match_parameterは、ファンクションのデフォルトの検索動作を変更するためのテキスト・リテラルです。match_parameterには次の値を1つ以上指定できます。

    • 'i': 大/小文字を区別せずに検索します。

    • 'c': 大/小文字を区別して検索します。

    • 'n': ピリオド(.)の使用を許可します。ピリオドは、改行文字を含む任意の文字と一致するワイルド・カード文字です。このパラメータを指定しない場合、ピリオドは改行文字には一致しません。

    • 'm': ソース文字列を複数行として処理します。Oracleは、^および$を、それぞれ、ソース文字列全体の開始または終了としてのみではなく、ソース文字列内の任意の場所にある任意の行の開始または終了としてとして解釈します。このパラメータを指定しない場合、Oracleはソース文字列を単一行として処理します。

    • 'x'は空白文字を無視します。デフォルトでは、空白文字は空白文字として一致します。

    複数の矛盾する値を指定すると、最後の値が使用されます。たとえば、'ic'を指定すると、大/小文字を区別する検索が行われます。前述以外の文字を指定すると、エラーが戻されます。

    match_parameterを指定しない場合、次のようになります。

    • 大/小文字を区別するかどうかのデフォルトは、NLS_SORTパラメータの値によって決まります。

    • ピリオド(.)は改行文字に一致しません。

    • ソース文字列は単一行として処理されます。


      関連項目:


次の問合せは、名前がStevenまたはStephenである(first_nameSteで始まって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_nameaeioまたは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