我想实现以下(全文搜索),
SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]'
我只对全文列中的确切字符串(而不仅仅是单词)感兴趣。
我一直在 MySQL 中使用上面的确切 SQL,现在将大部分代码迁移到 android 应用程序。
但我一直在查看各种帖子,其中提到 Android Sqlite 不支持 REGEXP(例如:link1、link2、link3)。
有没有办法在 Android 中启用 REGEXP?
如果没有,上述 SQL 是否有任何替代方案?
谢谢,
编辑: 目前我在 Android 中使用 REGEXP 时收到以下异常,
android.database.sqlite.SQLiteException: no such function: REGEXP (code 1):...
我知道我们可以使用 GLOB 和 LIKE (甚至可能是 MATCH )。如何columnname REGEXP '[[:<:]]somestring[[:>:]]'
转换为使用GLOB
和/或LIKE
和/或MATCH
?
解决方案 1:在@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的第二种解决方案在我的情况下要快得多。
解决方案2:处理不区分大小写
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]*')
)