パターン一致条件
パターン一致条件は文字データを比較します。
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