PDOのSQLite(3.5.4以前)でgroup_concat

SQLiteはバージョン3.5.4から便利な集約関数group_concatが使用できるようになりました。
逆に言えば、それより前のバージョンでは当然のことながら使うことはできません。
そこで、ユーザ定義関数(UDF)の出番です。

今回は、PHP5.1以降に標準で入っているPDOでgroup_concatを追加します。

// $dbにはSQLiteのPDOオブジェクトが入っているものとする。
function createGroupConcat($db)
    if (version_compare($db->getAttribute(PDO::ATTR_SERVER_VERSION), '3.5.4')<0) {
        $step_func = create_function('&$context, $rownumber, $string, $delimiter=\',\'', 'if (isset($string)) { if (isset($context)) $context .= $delimiter; $context .= $string; } return $context;');
        $finalize_func = create_function('&$context, $rownumber', 'return $context;');
        $db->sqliteCreateAggregate('group_concat', $step_func, $finalize_func);
    }
}

一応補足しておきますと、登録したgroup_concatが使えるのはユーザ関数を追加したPDOオブジェクトだけです。

SQLite3.5.4以降では登録処理をスキップしているので元々ある高パフォーマンスであろうgroup_concatをそのまま残します。
SQLite3.3.7で確認していますが、SQLite2系列でもできるかどうかは調べていません。

2012/01/17追記:区切り文字の変更に対応させました。UDFでもデフォルト引数が使えるんですね。