« 携帯サイトのアクセスキー設定 Main 指十字のサイン »

SQLiteで正規表現

登録されているIDで、「9-35」「7-128」のようにベース番号と個別番号がハイフンで繋がれているものがあって、個別番号は桁指定は特になく、ゼロ埋めなどもされていない。

このIDの中で同じベース番号での最大の個別番号を取り出したりしたいのだが、これはどうするか。

(データベースを作成し直して各番号を別項目として登録するのが、まっとうな対応の気はするが…)正規表現での値抜き出しがSQLiteでもできないか調べてみる。

どうも現在のところは正規表現ライブラリを別で用意して、それを拡張として読み込む形になるらしい。

また、それが使えるようになったとしても、マッチ箇所にのみ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)。

リンク

Leave a comment

Your comment