如何在Sqlite Android中实现字边界?

我想实现以下(全文search),

SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]' 

在哪里我只感兴趣的全文字段中的确切string(不只是单词)。

我一直在使用MySQL中的确切SQL,现在将大部分代码移植到android应用程序中。

但是我一直在寻找各种各样的post,提到在Android Sqlite中不支持REGEXP(例如: link1 , link2 , link3 )。

有没有办法在Android中启用REGEXP?

如果没有上述SQL的任何替代品?

谢谢,

编辑:目前,我在Android中使用REGEXP时收到以下exception,

 android.database.sqlite.SQLiteException: no such function: REGEXP (code 1):... 

我明白我们可以使用GLOB和LIKE(或者甚至可以是MATCH)。 如何转换columnname REGEXP '[[:<:]]somestring[[:>:]]'以使用GLOB和/或LIKE和/或MATCH

解决scheme1 : @cybersam的帮助下面是我正在使用(经过一些修改)

 SELECT * FROM tablename where (columnname GLOB '*some string*' OR columnname GLOB '*Some string*') AND ( ( (columnname GLOB '*[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]*' AND columnname GLOB '*some string[^a-zA-Z0-9_]*' AND columnname GLOB '*[^a-zA-Z0-9_]some string*') OR (columnname GLOB '*[^a-zA-Z0-9_]Some string[^a-zA-Z0-9_]*' AND columnname GLOB '*Some string[^a-zA-Z0-9_]*' AND columnname GLOB '*[^a-zA-Z0-9_]Some string*') ) ) 

GLOB是区分大小写的,所以我有一个额外的OR

@cybersam的第二个解决scheme在我的情况下要快得多。

解决scheme2 :处理敏感度的情况

 SELECT * FROM tablename where (columnname GLOB '*[sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG]*') AND ( ( columnname GLOB '*[^a-zA-Z0-9_][sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG][^a-zA-Z0-9_]*' AND columnname GLOB '*[sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG][^a-zA-Z0-9_]*' AND columnname GLOB '*[^a-zA-Z0-9_][sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG]*') ) 

要实际支持REGEXP ,您将不得不添加您自己的regexp()用户函数 。

一般来说, 这个链接可能会帮助您了解如何创build用户定义的函数,但这并不简单。

如果你的模式非常简单,那么GLOB运算符可能就足够了。

例如,要执行与此MYSQL查询等效的search:

 SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]' 

你可以在SQLite中试试这个:

 SELECT * FROM tablename where columnname GLOB '[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]' OR columnname GLOB 'some string[^a-zA-Z0-9_]' OR columnname GLOB '[^a-zA-Z0-9_]some string' OR columnname GLOB 'some string'; 

上面的查询使用的事实是,在MYSQL中,单词字符被定义为字母数字字符或下划线。 还需要附加的OR术语以匹配some string任一侧(或两侧)都没有文字的情况。

最后,如果“一些string”在columnname相对较less,那么以下较长的查询实际上可能会更快,因为它只对less数值执行多个GLOB评估:

 SELECT * FROM tablename where columnname GLOB '*some string*' AND ( columnname GLOB '[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]' OR columnname GLOB 'some string[^a-zA-Z0-9_]' OR columnname GLOB '[^a-zA-Z0-9_]some string' OR columnname GLOB 'some string');