SQLite是一個輕量級引擎,尤其在PHP中內置的2版本,并不帶有類似MySQL那樣的實用函數。
但是它提供了一套非常靈活的自定義函數方式。用戶可以將需要使用的功能,先用PHP函數實現,然后注冊到SQLite里面,就可以在SQL語句中使用了。
一個最簡單的例子:
function url2host($url) {
$parts = parse_url($url);
return "$parts[scheme]://$parts[host]";
}
// Tell SQLite to associate PHP function url2host( ) with the
// SQL function host( ). Say that host( ) will only take 1 argument.
sqlite_create_function($db, 'host', 'url2host', 1);
// Do the query
$r = sqlite_query($db, 'SELECT DISTINCT host(lower(url)) AS clean_host
FROM access_log ORDER BY clean_host;');
SQLite只支持Count,不支持Averag。所以類似功能也要寫函數實現。
因為需要對多項結果進行累加,注冊方式與普通函數注冊不同。注意:請嚴格按照格式進行書寫。看起來似乎很復雜,但是如果你用過array_walk,就會感覺到似曾相識了。
// average_step( ) is called on each row.
function average_step(&$existing_data, $new_data) {
$existing_data['total'] = $new_data;
$existing_data['count'] ;
}
// average_final( ) computes the average and returns it.
function average_final(&$existing_data) {
return $existing_data['total'] / $existing_data['count'];
}
//regist average , using average_step and average_final
sqlite_create_aggregate($db, 'average', 'average_step', 'average_final');
$r = sqlite_query($db, 'SELECT average(number) FROM numbers');
需要注意的是: SQLite對COUNT的語法支持與MySQL不同。
MySQL: select class, count(*) as cnt group by class where cnt > 3
SQLite: select class, count(*) as cnt group by class HAVING cnt >3
印象里面SQL2的規范方式就是這樣的,只是MySQL為了方便更靈活處理了而已。
另外,對于自定義函數,還有一點需要說明:
如果數據是二進制(比如圖象),需要進行解碼和編碼處理。因為函數是在SQLite內部運行的,二進制數據在SQLite內部是編碼存儲的。
$data = sqlite_udf_binary_decode($encoded_data);
.... .... //deal with $data
$result = sqlite_udf_binary_encode($return_value);
~~呵呵~~
新聞熱點
疑難解答