REGEXP、LIKE、SIMILAR TO の各探索条件は、どれもパターンと文字列を一致させようとする点で似ています。また、これらの 3 つはすべて、文字列内の部分文字列ではなく、文字列全体に一致させようとします。
これらの 3 つの探索条件の基本的な構文は似ています。
expression search-condition pattern
REGEXP では、SIMILAR TO でサポートされる正規表現の構文のスーパーセットがサポートされています。また、他の製品と互換性を持たせるため、REGEXP 探索条件では構文拡張がいくつかサポートされています。また、REGEXP と SIMILAR TO は、デフォルトのエスケープ文字が異なり、アンダースコア ( _ )、パーセント ( % )、および脱字記号 ( ^ ) の処理が異なります。REGEXP の動作は Perl 5 とほとんど一致します (ただし、Perl の構文と演算子がサポートされていない箇所を除く)。
pattern の LIKE 構文は単純で、少数のワイルドカードがサポートされていますが、正規表現構文は完全にはサポートされていません。
pattern の SIMILAR TO 構文では、ANSI/ISO SQL 標準に定義されている正規表現の構文を使用した強力なパターン一致を実行できます。
比較の実行において、REGEXP の動作は LIKE や SIMILAR TO とは異なります。REGEXP の比較では、データベースサーバーは「データベース文字セット」のコードポイント値を比較に使用します。この動作は、Perl などでの正規表現の実装と同じです。
LIKE と SIMILAR TO の場合、データベースサーバーは「データベース照合」の等価性とソート順を比較に使用します。この動作は、データベースが > や = などの比較演算子を評価する方法と同じです。
文字の比較方法が違うため、REGEXP と LIKE および SIMILAR TO とでは一致や範囲評価の結果が異なります。
一致における相違点 REGEXP では、コードポイント値を使用するため、パターンに含まれるリテラルと一致するのは、厳密な意味で同じ文字の場合のみです。このため、REGEXP での一致は、データベース照合、大文字と小文字の区別、またはアクセント記号の区別といった要因には影響されません。たとえば、'a' との一致として 'A' が返されることはありません。
LIKE と SIMILAR TO ではデータベース照合が使用されるため、文字が等価かどうかを判断する際に、大文字と小文字やアクセント記号の区別に影響されます。たとえば、データベース照合で大文字と小文字やアクセント記号が区別されない場合、一致でも大文字と小文字やアクセント記号が区別されません。そのため、'a' との一致として 'A' が返されることがあり得ます。
範囲評価における相違点
REGEXP では範囲評価にコードポイントが使用されるため、文字が範囲内と判断されるのは、その文字のコードポイント値が、範囲の最初と最後のコードポイント値と同じかその間にある場合になります。たとえば、比較 x REGEXP '[A-C]'
は、単一文字 x について、CAST(x AS BINARY) >= CAST(A AS BINARY) AND CAST(x AS BINARY) <= CAST(C AS BINARY)
と同義です。
LIKE と SIMILAR TO では、範囲評価に照合のソート順が使用されるため、文字が範囲内と判断されるのは、その文字の照合における位置が、範囲の最初と最後の文字の位置と同じかその間にある場合になります。たとえば、比較 x SIMILAR TO '[A-C]'
(x は 1 文字) は x >= A AND x <= C
と同義であり、比較演算子は照合のソート順を使用して評価されます。
次の表は、LIKE、SIMILAR TO、REGEXP が評価した範囲 '[A-C]'
に該当する文字を示しています。2 つのデータベースはどちらも 1252LATIN1 照合を使用しますが、最初のデータベースでは大文字と小文字が区別されず、2 番目では区別されます。
LIKE/SIMILAR TO '[A-C]' | REGEXP '[A-C]' | |
---|---|---|
demo.db (大文字と小文字の区別なし) | A、B、C、a、b、c、ª、À、Á、Â、Ã、Ä、Å、Æ、Ç、à、á、â、ã、ä、å、æ、ç | A、B、C |
charsensitive.db (大文字と小文字を区別) | A、B、C、b、c、À、Á、Â、Ã、Ä、Å、Æ、Ç、ç | A、B、C |
この結果から次のことを確認できます。
LIKE と SIMILAR TO は、範囲内のアクセント記号付き文字を含めます。
LIKE と SIMILAR TO では、データベースで大文字と小文字が区別されるかどうかに応じて、該当する文字が変わります。具体的には、結果に範囲内の小文字はすべて含まれますが、大文字と小文字が区別されるデータベースでの検索にそのような動作は期待されません。
同様に、大文字と小文字を区別するデータベースで、範囲内に含まれる文字に一貫性がないように見えることがあります。たとえば、大文字と小文字を区別するデータベースでの SIMILAR TO '[A-C]'
の結果には、A、b、B、c、C が含まれますが、a は含まれません。これは、ソート順で a が A より前に位置しているためです。
REGEXP は、データベースで大文字と小文字が区別されるかどうかに関係なく、A、B、C を返します。範囲に小文字も含めるには、その条件を範囲の定義に追加する必要があります。たとえば、REGEXP '[a-cA-C]'
のように指定します。
REGEXP の結果に含まれる文字のセットは、データベースで大文字と小文字が区別されるかどうかに関係なく、同じです。
データベースで使用されている照合、大文字と小文字の区別、アクセント記号の区別が、上記の例と異なる場合でも、データベースに接続して上記の文を実行することによって、同様のテストを実行し、LIKE、SIMILAR TO、REGEXP が返す内容を確認できます。
SELECT CHAR( row_num ) FROM RowGenerator WHERE CHAR( row_num ) LIKE '[A-C]'; SELECT CHAR( row_num ) FROM RowGenerator WHERE CHAR( row_num ) REGEXP '[A-C]'; SELECT CHAR( row_num ) FROM RowGenerator WHERE CHAR( row_num ) SIMILAR TO '[A-C]'; |
LIKE 探索条件
REGEXP 探索条件
SIMILAR TO 探索条件
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |