Skip to Content
Author's profile photo Sawa Ito

SAP SQL Anywhere で正規表現を使用する (過去のブログ記事より)

このページは、以下の英語ページの抄訳です。最新の情報については、英語ページを参照してください。

 

 

この記事のオリジナルは、Glenn Paulley が sybase.com に 2009年 6 月に掲載したものです。Glenn はこの中で、SQL Anywhere のクエリ内で正規表現を使用する方法について解説しています。

 

 

SQL Anywhere の version 11.0.0 では、正規表現検索を含む検索条件が実装されました。使用可能な正規表現検索述部には、2種類のバリアントがあり、それぞれに独自のセマンティクスがあります。 SIMILAR TOREGEXPです。

 

 

SIMILAR TO

 

SIMILAR TO 述部は、ANSI/ISO SQL 2008 の一部です。しかしながら、2011年の次の標準 SQLのドラフトは、現在作成途中で、WG3 編集ミーティングがまさに今週韓国で開催されています。そして、SIMILAR TO は、標準 SQL 規格の次のバージョンからは除かれるようです。というのも、この機能は、REGEXP_LIKE 述部 (以下を参照してください)に代わる方向だからです。

 

SIMILAR TO 述部のシンタックスは、簡単です。

 

 

  1. expression [ NOT ] SIMILAR TO pattern [ ESCAPE escape-expression ]

 

しかしながら、いつものように、「devil (厄介な点)」は詳細部分にあります。スターターのために、以下に SQL Anywhere デモデータベースを使用した例を挙げます。

 

  1. SELECT*
  2. FROM Customers
  3. WHERE PostalCode NOT SIMILAR TO ‘([0-9]{5})|([0-9]{5}-[0-9]{4})|([A-Z][0-9][A-Z][[:whitespace:]]{1}[0-9][A-Z][0-9])’

 

上記は全て無効な郵便番号(米国とカナダのどちらか)をもつアドレスであることがわかります。受けつけられるコードは、 (a) 5桁の番号 (US)、(b) 5桁の番号、ダッシュ、4桁の番号 (US) そして (c) 6桁のアルファベットと数字を組み合わせと埋め込まれた空白が1つのカナダの郵便番号の形式です。

/wp-content/uploads/2016/01/similarto_875687.png

 

しかしながら、SIMILAR TO でサポートされている正規表現のパターンは、他のソフトウェアパッケージ(例えば Perl など)でサポートされている正規表現条件とは異なります。以下に、相違点の一部をリストします。(詳細は、SQL Anywhere のマニュアルに記載されています。)

 

  • LIKEREGEXPのように、SIMILAR TO は、全体の値にマッチしますが、値の一部にはマッチしません。
  • SIMILAR TO は、”%” (パーセント) と “_” (下線) をLIKE と同じようにワイルドカード文字として使用します。”.*”のかわりに、”%” を使用することができます。
  • SIMILAR TO は、[:ascii:]、 [:blank:]、 [:punct:]のような様々な 部分文字をサポートしていません。
  • おそらく、最も重要なのは SIMILAR TOが string 値を比較する場合に、照合ベースの比較を使用することです。これは、便利かもしれません。例えば、SQL Anywhere のデフォルトの大文字・小文字を区別する文字列マッチングでは、パターン [A]{1} は [a]{1} と同等です。そして、これらの同一性は、アクセント記号付文字の特定の照合にも適用される可能性があります。しかしながら、重要な欠点は、レンジパターンが、適切に機能しないことです。レンジパターン [A-C] は、実際、大文字 A、B、Cにのみマッチするわけではありません。デフォルトの大文字・小文字を区別する照合 [A-C] は、A、B、b、c、C のどの文字にもマッチします。 “a” とは マッチしません。なぜならば、”a” の文字は、照合順において”A” に先行しないからです。これは、上の例ではカナダの郵便番号を適切にバリデートできないことを意味しています。このクエリは、小文字を含むカナダの郵便番号を受けつけてしまいます。

 

 

REGEXP

 

SQL Anywhere 11.0.1 では、REGEXP 述部は、正規表現検索をサポートしている Perl やその他の UNIX ベースのツールの方式で正規表現パターンをサポートしています。繰り返しますが、シンタックスは簡単です。

  1. expression [ NOT ] REGEXP pattern [ ESCAPE escape-expression ]

 

標準 SQL において、述部キーワード LIKE_REGEXP を使用するという例外を除けば、シンタックスはバーチャルに同一です。サポートされているパターンは、標準の XQuery 部分からのものです。SQL Anywhere では、様々なソース、特に Perl からパターンシンタックスを採用してきました。 REGEXP は、照合ベースのマッチングを使用しません。マッチングは、データベースキャラクターセットのコードポイント値に基づいています。例えば、単一の文字 X の比較X REGEXP '[A-C]'は、CAST(X AS BINARY) >= CAST(A AS BINARY) AND CAST(X AS BINARY)と同等です。REGEXPは、プログラマーにとってなじみのある共通のメタ文字やサブクラスをサポートしています。また、特別なエスケープ文字、例えばスペースの “\s”、キャリッジリターンの “\r”、そして先読みアサーションや後読みアサーションなどの文字もサポートしています。下は、郵便番号をバリデートする同じ例ですが、今回は REGEXP を使用しています。

 

  1. SELECT *
  2. FROM Customers
  3. WHERE PostalCode NOT REGEXP ‘([0-9]{5})|([0-9]{5}-[0-9]{4})|([A-Z][0-9][A-Z]\s[0-9][A-Z][0-9])’

 

最後に、SQL Anywhere のクエリオプティマイザーは、特定のパターンによって、インデックススキャンの sargable 述部として使用するため、自動的に REGEXP と SIMILAR TO 述部を — LIKE 述部 と同様に — 最適化することに注意してください。

 

 

 

===

 

SAP SQL Anywhere に関する詳細情報は、SAP SQL Anywhere Communityページ<英語> を参照してください。

 

上記のコミュニティーに掲載されている技術情報は、順次SQL Anywhere 日本語コミュニティ

に掲載しています。

 

SQL Anywhere に関してはまずはこちらをご参照ください。無期限でご利用いただける無償の Developers Edition もこちらからダウンロードが可能です。

 

SQL Anywhere に関して技術的な質問のある方はコミュニティに登録し、
「Ask a Question」機能をご利用ください。

Language には「Japanese」、
Primary Tag には「SAP SQL Anywhere」を選択
User Tagに「sql anywhere」「sql anywhere Japanese question」

を入力してください。

不具合につきましては、サポート契約者様専用の問い合わせ方法にてお問い合わせください。

 

======================
ご購入に関するお問い合わせ

こちらよりお問い合わせください。

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.