SQLiteで正規表現
登録されているIDで、「9-35」「7-128」のようにベース番号と個別番号がハイフンで繋がれているものがあって、個別番号は桁指定は特になく、ゼロ埋めなどもされていない。
このIDの中で同じベース番号での最大の個別番号を取り出したりしたいのだが、これはどうするか。
(データベースを作成し直して各番号を別項目として登録するのが、まっとうな対応の気はするが…)正規表現での値抜き出しがSQLiteでもできないか調べてみる。
どうも現在のところは正規表現ライブラリを別で用意して、それを拡張として読み込む形になるらしい。
- Big Sky :: DBD::SQLiteで正規表現SQLを使う
- SQLite3と鬼車で正規表現検索 + sqlite3-ruby-1.2.1パッチ当て – 与太郎プログラマの日記
- SQLite3におけるREGEXP演算子 – anon_193の日記
- SQLiteで正規表現を使いたい場合は関数を自分で作成する必要があるみたい – Guyon Diary
また、それが使えるようになったとしても、マッチ箇所にのみmaxを適用するというようなことができるのか不明。
ということで、ID項目を個別の番号項目に分けることも考えたが、とりあえず決め打ちで3桁ゼロ埋めで更新して対応しようかと思う今日この頃…。
[追記]
ベース番号とハイフンの桁は固定なので、それ以降を substr で抜き出してやればいいのではと試してみたが、
sqlite> select max(substr(id,4,100)) from foo; 99
目論見の動作はしたものの、SQLiteの比較が文字列で行なわれるので、数値での最大は求まらない(200番台のデータがあっても、上記のように99が最大となってしまう)。結局ゼロ埋めだかの桁揃えは必要なのだった…。
と思ったら、次のように文字列をabs()やround()の算術関数に渡すと数値として比較してくれるらしい。
sqlite> select max(abs(substr(id,4,100))) from foo; 260.0
小数点以下の「.0」を除くには、他だとcint()などの整数化関数が使えるものもあるようなのだが、こちらのSQLiteでは使えないので、強引に文字列末の2文字を削除:
sqlite> select substr(max(A),1,length(A)-2) from ...;
とりあえずは、こちらでいいかな?(※「WordPressでSQLがうまく書けない」問題のため上記は省略した記述になっていますm(__)m)。
リンク
- SQLiteで文字列置換 ≪ 来栖川電算
- substr関数 – SQLite関数の使い方 – SQLite入門
- SQLele資料集/SQLiteの型 – HSP開発wiki
- SQL CINT関数で文字列を整数型 (Integer)に変換する