SSブログ

RDBMSにおける正規表現(REGEXP) [SQLポケリ]

DSC_1228[1].jpg

お盆休みはがっつりゲーム三昧であった。最近の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

本日はここまで。




サイト内を検索

nice!(0) 
共通テーマ:パソコン・インターネット

nice! 0



Copyright Atsushi Asai Google+朝井淳
[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)

イラストで理解 SQL はじめて入門

イラストで理解 SQL はじめて入門

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/05/16
  • メディア: 単行本(ソフトカバー)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/03/03
  • メディア: 単行本(ソフトカバー)

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/05/25
  • メディア: 大型本

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。