Posted at

SQLite(3.5.4以前)でgroup_concat(PHPから使う場合)

More than 1 year has passed since last update.

SQLiteはバージョン3.5.4から便利な集約関数group_concatが使用できるようになりました。

逆に言えば、それより前のバージョンでは当然のことながら使うことはできません。

そこで、ユーザ定義関数(UDF)の出番です。

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


group_concat.php

// $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系列でもできるかどうかは調べていません。

(昔自分のサイトで書いたやつの再掲です。)