« PostgreSQLの無停止メンテナンスツール | トップページ | PHP:デフォルト引数値の使用 »

2015.03.23

特定の文字以外を含む行の抽出

英数文字といくつかの記号以外は含まれないようにしたい、というバリデーションニーズは当然よくあることと思う。
もちろん入力段階(クライアントサイド)ではじくべきものではあるが、サーバサイドでもポカ除けをすることは必要だ。
あるいはポカよけが働いていなくて、DBに格納されてしまってから調査が必要になることもあるかと。

当然こうしたニーズに対してはいつだってボクらの味方は正規表現である。SQLだけでこの問題のあるレコードを探してみよう。

正規表現を行うにあたっては正規表現マッチ演算子だけでいけそうである。

SELECT * FROM hoge WHERE hogehoge ~ '[^A-Za-z0-9]';
とりあえずこれだけで英数以外を含む行が抽出できる。
通常の正規表現のブラケット式が使用できるためだ。
一応補足すると[]で囲まれた内部にパターン表現ができる。A-Zで大文字のAからZをa-zで小文字のaからz、0-9で数字の0から9を含む、という意味になっている。
先頭にある^によって、"以外"という意味になるため、今回の検索条件はhogehogeカラム内に英数字以外のキャラクターを含んでいるもの、という意味になる。

英数字以外に空白やいくつかの記号が含まれていても良い、ということもあるかもしれない。
その場合空白であれば\sが使用できる。

SELECT * FROM hoge WHERE hogehoge ~ '[^A-Za-z0-9\s]';
そのほかの特定の文字も\でエスケープすることで、このリストに加えることができる。
SELECT * FROM hoge WHERE hogehoge ~ '[^A-Za-z0-9\s\-\,]';
これでハイフンとカンマも含まれててもOKという状態である。

|

« PostgreSQLの無停止メンテナンスツール | トップページ | PHP:デフォルト引数値の使用 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/61325264

この記事へのトラックバック一覧です: 特定の文字以外を含む行の抽出:

« PostgreSQLの無停止メンテナンスツール | トップページ | PHP:デフォルト引数値の使用 »