
想用sql语句以正则匹配的方式从sqlite数据库中获取我想要的一组数据,语句如下:
SELECT id,word FROM words WHERE word REGEXP "^[a-zA-Z]+$" LIMIT 10
Mysql中无误执行的SQL语句,在sqlite数据库却回报了错误:
General error: 1 no such function: REGEXP.
REGEXP函数不存在?
可Sqlite文档中分明存在着关于REGEXP的说明,不过这段英文说明与其他关键字的说明有一些不同,我一时没有理解它所表达的意思。通过搜索引擎大神,才明白,原来Sqlite这个迷你数据库系统并没有内置实现正则表达式的功能,只是提供了一个REGEXP的关键字,这个关键字实际上是一个需要用户自行编写的自定义函数,譬如我现在用PHP和Sqlite结合开发,那就需要编写一个PHP的函数供Sqlite调用,譬如:
function sqliteRegexp( $pattern ,$subject )
{
//至少在Mysql中,正则表达式是不需要加边界符“/”的,但对PHP的preg_match函数则必须写明边界符,我在函数内部补全边界符,可以保证sqlite下的正则表达式写法和Mysql下一致,让sql语句在多个数据库间无缝移植。
return preg_match('/'.$pattern.'/',$subject,$match);
}
这个函数保存在你的PHP程序可以调用的位置,假设在functions.php文件中,那么在执行Sqlite的正则查找时,PHP代码要这样写:
//包含你定义的外置的Sqlite正则函数
include('functions.php');
//建立Sqlite的数据库连接
$DB = new PDO('sqlite:/yourpath/yourdb.sq3');
//将你的外置函数注册到Sqlite中,第一个参数是sqlite内部函数名,第二参数是外置PHP函数名称,第三参数是外置函数需要的参数数量
$DB->sqliteCreateFunction('REGEXP','sqliteRegexp',2);
//执行SQL语句
$result = $DB->query("SELECT id,word FROM words WHERE word REGEXP '^[a-zA-Z]+' LIMIT 10");
//获取数据
$data = $result->fetchAll();
这样你就可以在Sqlite的数据操作中应用正则表达式进行匹配啦!
再回头来看,Sqlite的REGEXP实际就是我们自行定义的一个函数,所以也适用函数模式的写法,下面的SQL写法在Sqlite也是可以正确执行的:
$result = $DB->query("SELECT id,word FROM words WHERE REGEXP ('^[a-zA-Z]+',word) LIMIT 10);
哪怕你把它命名成'dog'、'pig',也不影响它的使用,那为什么Sqlite还专门提供一个REGEXP的关键字呢?其实就是为了实现SQL语句的写法和其他数据库兼容,增加SQL语句的可迁移性。
和REGEXP关键字类似的,Sqlite还提供了MATCH关键字来提供类似Mysql的Match关键字语法,当然具体怎么实现还是要靠你自己编写,Sqlite就不给管了。
本博客文章非特别注明均属原创,如需转载请保留本博客地址:http://dao.daimaku.com
[