RDBMSにおける正規表現(REGEXP)
お盆休みはがっつりゲーム三昧であった。最近のPCゲームはなんかスゴイねぇ。
さて、久しぶりにデータベースネタをやってみようと思う。
正規表現ってプログラマならよく使うと思う。検索とかの時にね。
この間作った機密情報が入ったファイルの名前なんだっけか?えーと「secretほにゃらら」だったと思うのだが...
っていう時、エクスプローラーで「secret*」というように検索するよね?
*の部分がほにゃららに対応するので、secret_info.txtだったり、secret_image.jpgだったりが検索結果としてヒットする。
この*はワイルドカードとかメタ文字と呼ばれるもので、*の他にも色々種類があるのだが、RDBMSで標準的に使うことができるのは以下の2種類しかない。
%
_
なんとも寂しい感じである。
SQLを知らない人向けに簡単に説明すると、%が任意の文字列にマッチするワイルドカード。_は任意の1文字にマッチする。
でもってこれらの検索には「LIKE演算子」を使って条件式を書かないといけない。
まぁ、そんなに難しくはないでしょ?例を挙げてみると以下のような感じ。
SELECT file_name FROM file_list WHERE file_name LIKE 'secret%' file_name ----------------- secret_info.txt secret_image.jpg
冒頭のファイル名での検索をSQLでやってみた感じである。
でもって、メタ文字である%や_を使って表記した文字列(ここでは'secret%')が正規表現で記述したものなのか、というとそうではない。
正規表現、英語で言ったらRegular Expressionなのだが、ちゃんとした国際規格になっている。SQLのLIKEで使われるのは正規表現とは異なる独自規格なのである。
正規表現で任意の文字列を表記するには「.*」とする。*だけならエクスプローラーでもやるので馴染みがあるのだが、なんか.が付いてる。
この「.」が意味するものはSQL LIKEでの「_」と同じ。つまり任意の1文字とマッチする。
一方の「*」は何かというと0回以上の繰り返しを意味する。つまり、正規表現「.*」は「任意の1文字を0回以上繰り返したもの」という意味になる。
他にもSQL LIKEと正規表現の違いは多くあり、正規表現の方がはるかに大きな仕様となっていて、様々なマッチング処理が可能になっている。
REGEXP
RDBMSの種類にもよるのだが、正規表現が使えたり、使えなかったり、拡張モジュールを入れないと使えなかったり、とまぁいろいろあるのでちゃんと調べるついでに記事にしてみるか、というのが今回の趣旨となる。
RDBMSではREGEXP~という関数が使える場合がある。REGEXPはRegular Expressionの略。REGEXP~関数を追いかけていけば、RDBMSにおける正規表現対応状況が把握できるのではないかということでSQLポケリを引っ張り出してきたのである。
Oracleでの正規表現
まずは、Oracleさんである。結構前から正規表現でのマッチングはできたような気がする。正規表現を使うとメタ文字で表記した部分だけを取り出したり、置換したりすることが可能なのだが、OracleにはREGEXPから始まる関数が存在している。
REGEXP_COUNT
REGEXP_LIKE
REGEXP_INSTR
REGEXP_SUBSTR
SQLポケリ4版にはREGEXP_COUNTとREGEXP_LIKEのみが項として載っている(332ページと282ページ)。REGEXP_INSTRについてはINSTRのページに、REGEXP_INSTRもあるよ、と付け足されている。REGEXP_SUBSTRも同様。
SQL Serverでの正規表現
SQL Serverでは正規表現は全くダメ。使おうと思ったら自分で関数作って拡張しないとダメ。ただ、LIKEで使えるメタ文字が少しだけ多いのでそれでお茶を濁している感じかな。MS AccessもエンジンはSQL Serverと統合されちゃった感じなのでほとんど同じ状況。
そもそも、Windowsにはgrepがなかったからなぁ。正規表現を使いたかったらクライアント側でなんとかやってね、というスタンスなのかも。
DB2での正規表現
v11になってREGEXP~関数が使えるようになったらしいぞ。DB2はOracle互換とか言ってたから「Oracleにならえ」ということなんでしょう。普通に使えるようになるのは良いことだと思う。
SQLポケリ4版はv10までなので、REGEXPがらみは書いてない。
PostgreSQLでの正規表現
Postgresではいつの頃からかREGEXP関係の関数が使えるようになっている。まぁ、昔から~演算子で正規表現マッチングできていたからね。
オープンソース系はみなgrepの存在するプラットホームで動いていたから正規表現はお手の物という感じ。
MySQLでの正規表現
MySQLはOracleに引き取られたので、Oracleと同じようになってきている。REGEXPも同じように使えるみたい。
問題はMariaDBの方だが...検索してみると... なんだちゃんとあるじゃん。MySQLと互換性ありって言っているので問題なしかも。
SQLite
最後はSQLiteかな、オープンソースものは正規表現対応のものが多いのだが...
えーと前にもちょっと調べた気がしてきた。
SQLポケリ4版のREGEXP演算子(281ページ)には「拡張モジュールをロードする必要があります」って書いてある。
今現在のSQLiteのドキュメントを見るとREGEXP演算子が使えるみたいに書いてある。これはどこかで拡張モジュールを入れなくてもOKになった?のかなぁ...
ドキュメントにはregexp演算子はユーザー定義関数のregexpを呼び出すだけみたいな記載があるだけだな。
やっぱり拡張モジュールを入れないとダメなのかな。
とうことで大体の対応状況はわかった。REGEXP~関数に対応しているのは、以下のRDBMSである。
Oracle
DB2
PostgreSQL
MySQL/MariaDB
本日はここまで。
投稿者プロフィール

最新の投稿
コンピューター関係の記事2025年4月26日アイキャッチ画像にSQLアイコンとJSONアイコンが欲しい
コンピューター関係の記事2025年4月23日AdSense審査に無事パス
コンピューター関係の記事2025年4月22日SSブログ復活
コンピューター関係の記事2025年4月22日SSブログが無くなった余波は大きい