パターンマッチング条件(Pattern-matching Condition)は、文字データを比較するために使用されます。
パターンマッチング条件のタイプには、LIKE 条件と REGEXP_LIKE 条件が含まれます。
LIKE条件
LIKE 条件はパターンマッチングに使用されます。等号演算子(=)は、ある文字値と別の文字値が完全に一致することを指しますが、LIKE 条件は、最初の値内で2番目の文字値によって指定されたパターンを検索することで、1つの文字値の一部と別の文字値を照合します。
LIKE は、入力された文字セットで定義された文字を使用して文字列を計算します。
LIKE条件構文
char1 [NOT] LIKE char2 [ ESCAPE esc_char ]
説明
LIKE 条件に「||"」文字が含まれている場合、それを論理OR演算子として使用でき、sql_mode によって制御されます:
sql_modeにPIPES_AS_CONCATが含まれていない場合、||は論理OR演算子として認識されます。sql_modeにPIPES_AS_CONCATが含まれている場合、||は文字連結演算子として認識されます。
パラメータの説明
| パラメータ | 説明 |
|---|---|
| char1 | 文字列などの文字式を検索値と呼びます。 |
| char2 | 文字式は通常リテラルであり、パターンと呼ばれます。 |
| esc_char | 文字式は通常リテラルであり、ESCAPE は esc_char をエスケープ文字としてマークします。エスケープ文字がパターンマッチング記号の前に置かれると、そのパターンマッチング記号は通常の文字として解釈されます。 |
使用方法
esc_char が指定されていない場合、デフォルトのエスケープ文字はありません。char1、char2、または esc_char のいずれかがNULLの場合、結果は不明です。それ以外の場合、エスケープ文字(指定されている場合)は長さ1の文字列でなければなりません。
すべての文字式(char1、char2、および esc_char)は、CHAR、VARCHAR2、NCHAR、または NVARCHAR2 など、任意のデータ型を持つことができます。これらのデータ型が異なる場合、OceanBaseデータベースはそれらをすべて char1 のデータ型に変換します。
パターンには、以下の特殊なパターンマッチング文字を含めることができます:
アンダースコア(_)は、値内のちょうど1文字(マルチバイト文字セット内の1バイトではない)に一致します。
パーセント記号(%)は、値内の0文字以上の任意の文字列に一致します(マルチバイト文字セット内のバイトとは対照的です)。パターン「%」はNULLと一致しません。
LIKEはワイルドカードを検出しない場合、=に変換できます。たとえば、SELECT * FROM t1 WHERE c1 LIKE 'ABC';は「filter("c1"='abc')」と同じです。
ESCAPE 句を使用して、パターン内に実際の文字 % または _ を含めることができます。エスケープ文字がパターン内の文字 % または _ の前にある場合、OceanBaseデータベースはその文字を特殊なパターンマッチング文字として解釈するのではなく、パターン内で文字通りに解釈します。また、エスケープ文字自体を検索することもできます。たとえば、@ がエスケープ文字である場合、@@ を使用して @ を検索できます。
説明
ASCIIに等しいアンダースコア(_)とパーセント記号(%)のみがパターンマッチング文字として認識されます。それらは、East Asian文字セットとUnicodeの全角変種では通常の文字と見なされます。
次の例では、x [不] パターン y に一致する場合、TRUE となります。y では、文字 % はNULLを除く任意の文字列の0文字以上に一致します。文字 _ は任意の単一の文字に一致します。パーセント記号(%)とアンダースコア(_)以外の任意の文字を ESCAPE の後に続けることができます。前にエスケープ文字がある場合、ワイルドカードはリテラルとして扱われます。
x [NOT] LIKE y [ESCAPE 'z']
例
次のステートメントでは、LIKE 条件が使用されています。ESCAPE '\' は %A\_B% の \ の後に続くパターンマッチング文字 '_' を通常の文字として解釈します。
SELECT last_name FROM emp WHERE last_name LIKE '%A\_B%' ESCAPE '\' ORDER BY last_name;
REGEXP_LIKE条件
REGEXP_LIKEは正規表現によるマッチングに使用されます。REGEXP_LIKEは、入力文字セットで定義された文字を使用して文字列を評価します。
REGEXP_LIKE条件構文
REGEXP_LIKE(source_char, pattern [, match_param ])
パラメータの説明
| パラメータ | 説明 |
|---|---|
| source_char | 検索値として使用する文字式。データ型は CHAR、VARCHAR2、NCHAR、NVARCHAR2、または CLOB です。 |
| pattern | 正規表現であり、通常はテキストリテラルです。データ型は CHAR、VARCHAR2、NCHAR、または NVARCHAR2 です。 |
| match_param | データ型 VARCHAR2 または CHAR の文字式であり、条件のデフォルトのマッチング動作を変更するために使用されます。 |
使用方法
pattern は最大512バイトを含むことができます。pattern のデータ型が source_char のデータ型と異なる場合、OceanBaseデータベースは pattern を source_char のデータ型に変換します。
match_parameter には、次のいずれかの値を1つ以上指定できます。
'i'は大文字と小文字を区別しないマッチングを指定します。'c'は大文字と小文字を区別するマッチングを指定します。'n'は句点 (.) を使用して改行をマッチングすることを許可します。このパラメータを省略した場合、句点と改行はマッチしません。'm'はソース文字列を複数行として扱うことを意味します。OceanBaseデータベースは、^と$をそれぞれソース文字列の任意の行の先頭と末尾として解釈し、ソース文字列全体の先頭または末尾に限定されることはありません。このパラメータを省略した場合、OceanBaseデータベースはソース文字列を単一行として扱います。'x'は空白文字を無視することを意味します。デフォルトでは、空白文字はそれ自身とマッチします。
match_parameter に矛盾する複数の値を指定した場合、OceanBaseデータベースは最後の値を使用します。たとえば、'ic' を指定した場合、OceanBaseデータベースは大文字と小文字を区別するマッチングを使用します。指定した文字が上記の値に該当しない場合、エラーが返されます。
match_parameter を省略した場合、次のマッチングルールに従います。
デフォルトの大文字と小文字の区別は、
NLS_SORTシステム変数の値によって決定されます。句点 (.) は改行とマッチしません。
ソース文字列は単一行として扱われます。
例
テーブル emp を作成し、データを挿入します。
CREATE TABLE emp(manager_id INT, first_name varchar(50), last_name varchar(50), hiredate varchar(50),SALARY INT);
INSERT INTO emp VALUES(300, 'Steven', 'King', '2019-09-11',23600);
INSERT INTO emp VALUES(200, 'Steven', 'Markle', '2019-11-05', 23800);
INSERT INTO emp VALUES(100, 'Deven', 'Part', '2018-10-01',24000);
INSERT INTO emp VALUES(200, 'Carlos', 'Ross', '2019-06-11',23500);
INSERT INTO emp VALUES(200, 'Teven', 'Bell', '2019-05-25', 23000);
INSERT INTO emp VALUES(200, 'Stephen', 'Stiles', '2018-06-11',24500);
INSERT INTO emp VALUES(100, 'Ame', 'De Haan', '2018-05-01',11000);
INSERT INTO emp VALUES(100, 'Jon', 'Errazuriz', '2017-07-21', 1400);
COMMIT;
クエリは、名前が Steven または Stephen の従業員の名前と姓を返します(ここで first_name は Ste で始まり、en で終わり、その間に v または ph が含まれます)。
obclient> SELECT first_name, last_name FROM emp WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$')
ORDER BY first_name, last_name;
+------------+-----------+
| FIRST_NAME | LAST_NAME |
+------------+-----------+
| Stephen | Stiles |
| Steven | King |
| Steven | Markle |
+------------+-----------+
3 rows in set
クエリは、姓に二重母音を含む従業員の姓を返します(ここで last_name には、大文字と小文字を区別せず、隣接するa、e、i、o、またはuが2つ含まれています)。
obclient> SELECT last_name
FROM emp
WHERE REGEXP_LIKE (last_name, '([aeiou])\1', 'i')
ORDER BY last_name;
+-----------+
| LAST_NAME |
+-----------+
| De Haan |
+-----------+
1 row in set