正規表現の条件
regex_like関数では、正規表現の照合が実行されます。正規表現は、正規表現エンジンが入力文字列との照合を試行するパターンです。問合せでregex_like関数を起動する構文は、関数コールの項で説明されている他のすべての関数と同じです。regex_like関数には2つのシグネチャがあり、それぞれ2つのパラメータと3つのパラメータがあります。
構文
boolean regex_like(any*, string)
boolean regex_like(any*, string, string)
セマンティクス
regex_like関数では、標準SQLのLIKE演算子と同様の機能が提供されます。つまり、この関数を使用して、入力文字列が特定のパターンと一致するかどうかをチェックできます。入力文字列とパターンは、それぞれ1番目と2番目の引数で計算されます。3番目のオプションの引数は、照合の実行方法に影響するフラグ・セットを指定します。
通常、regex_like関数は、その各引数が単一の文字列を返すことを想定しています。そうでない場合は、次のように動作します。
- 最初の引数が文字列を返さないことがコンパイル時に検出されると、コンパイル時のエラーが発生します。そうでない場合、最初の引数で何も返されない場合、複数の項目または文字列でもNULLでもない単一の項目が返される場合はfalseを返します。
- パターンやフラグが単一の文字列またはNULLを返さない場合は、エラーが発生します。
- いずれかの引数が単一のNULLを返す場合、NULLを返します。
それ以外の場合、regex_like関数は次のように動作します。
- パターン文字列が有効でない場合、または長さが512文字を超える場合にエラーが発生します。
- パターンが入力文字列と一致しない場合にfalseを返します。
- パターンが入力文字列と一致する場合にtrueを返します。
パターン文字列は、入力テキストと照合する正規表現です。パターン文字列の構文は、java Patternクラスでサポートされているもののサブセットです(https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.htmlを参照)。具体的には、正規表現の各文字は、それ自体に一致するリテラル文字か、または特別な意味を持つ構成を指定するメタ文字のどちらかです。サポートされる構成は、引用符で囲まれた文字、引用符で囲まれた構成、ピリオド(.)、およびグリーディ数量詞(*)のみです。
ピリオド(.)は、改行を除くすべての文字と一致するメタ文字です。グリーディ数量詞(*)は、前述の要素が0個以上出現することを示すメタ文字です。たとえば、regex "D.*"は、文字Dで始まり、その後に0個以上の文字が続く文字列と一致します。
サポートされている事前定義済の引用符で囲まれた文字のリストについては、https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.htmlを参照してください。
フラグ文字列には1つ以上の文字が含まれており、それぞれの文字は特定の動作を指定するフラグです。次の表に、使用可能な文字とそのセマンティクスの完全なリストを示します。
表6-2 事前定義済の引用符で囲まれた文字
フラグ | 名前 | 説明 |
---|---|---|
"d" | UNIX_LINES |
Unix行モードを有効にします。 このモードでは、ピリオド(.)の動作で認識されるのは行の終了文字\nのみです。 |
"i" | CASE_INSENSITIVE |
大/小文字を区別しない照合を有効にします。 デフォルトでは、CASE_INSENSITIVE照合では、US-ASCII文字セットの文字のみが一致するとみなされます。このフラグと組み合せてUNICODE_CASEフラグを指定すると、Unicode対応のCASE_INSENSITIVEを有効にできます。 このフラグを指定すると、若干のパフォーマンス・ペナルティが発生する場合があります。 |
"x" | COMMENTS |
パターンの空白とコメントを許可します。 このモードでは、空白は無視され、#で始まる埋込みコメントは行の終わりまで無視されます。 |
"l" | LITERAL |
LITERALを指定すると、パターンを指定する入力文字列が一連のリテラル文字として扱われます。メタ文字やエスケープ・シーケンスには、特殊な意味はありません。このフラグと組み合せて使用すると、CASE_INSENSITIVEとUNICODE_CASEは照合に及ぼす影響を保持します。その他のフラグは不要になります。 |
"s" | DOTALL |
DOTALLモードを有効にします。DOTALLモードでは、式のドット(.)は、行の終了文字を含むすべての文字と一致します。ただし、デフォルトでは、式のドット(.)は行の終了文字と一致しません。 |
"u" | UNICODE_CASE |
CASE_INSENSITIVEフラグを有効にすると、デフォルトでは、US-ASCII文字セットの文字のみを使用して照合が実行されます。UNICODE_CASEを指定すると、Unicode標準を使用したCASE_INSENSITIVE照合が行われます。 このフラグを指定すると、パフォーマンス・ペナルティが発生する場合があります。 |
"c" | CANON_EQ |
このフラグを指定すると、完全な正規分解が一致する場合にのみ、2つの文字が一致するとみなされます。このフラグを指定すると、たとえば、式a\u030Aは文字列\u00E5に一致します。デフォルトでは、照合は標準的な等価を考慮しません。 このフラグを指定すると、パフォーマンス・ペナルティが発生する場合があります。 |
"U" | UNICODE_CHARACTER_CLASS |
事前定義済文字クラスおよびPOSIX文字クラスのUnicodeバージョンを有効にします。このフラグを指定すると、(US-ASCIIのみ)事前定義済文字クラスおよびPOSIX文字クラスがUnicode技術標準に準拠します。http://unicode.org/reports/tr18/#Compatibility_Propertiesを参照してください。 フラグはUNICODE_CASEを示し、Unicode対応の大文字/小文字の折りたたみが有効になります。このフラグを指定すると、パフォーマンス・ペナルティが発生する可能性があります。 |
注意:
regex_like関数は、索引スキャンの最適化には使用されません。例6-47 正規表現
姓がSで始まる人をすべて選択するには、次の問合せで示されているパターンを使用します。
SELECT id, lastName FROM users where regex_like(lastName, "S.*");
+----+----------+
| id | lastName |
+----+----------+
| 10 | Smith |
+----+----------+
1 row returned
例6-48 正規表現
姓にaまたはAが1つ以上含まれている人をすべて選択するには、次の問合せで示されているパターンを使用します。
SELECT id, lastName from users where regex_like(lastname,".*a.*","i");
+----+----------+
| id | lastName |
+----+----------+
| 20 | Ann |
| 30 | Paul |
+----+----------+
2 rows returned