DBD::SQLiteでREGEXP演算子を使うメモ

UDFにしないといけない。UTF-8決めうちにしてるけど、SQLiteで日本語使うのに他の文字コード使う理由もそうないだろうし、別にいいよね。

use DBI;
use Encode qw/decode/;

my $dbh = DBI->connect('dbi:SQLite:dbname=sqlite3.db', '', '') or die $!;

$dbh->func('regexp', 2, sub {
    my ($pattern, $target) = @_;
    if ($target) {
        # utf-8 octetsからutf-8 strにしておく。
        # これやっておかないと"."が日本語1文字にマッチしない。'あ' !~ /^.$/
        # こんなの書きたくないよねってこと。'あ' =~ /^...$/
        $_ = Encode::decode 'utf-8', $_ for $target, $pattern;
        $target =~ m/$pattern/;
    }
    else { return }
}, 'create_function');

my $sth = $dbh->prepare(q"SELECT * FROM tbl WHERE col REGEXP '^pat'");

効率? 今回は全データ読んでもたかだか数万件しかなくて、なんならいったん全データ引っ張ってきてPerl側で絞ってもいいから考えてないです><