Я хотел бы получить следующее (полнотекстовый поиск),
SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]'
Где меня интересуют только точные строки (а не только слова) из полнотекстового столбца.
Я использую точный SQL выше в MySQL и теперь переношу большую часть кода в приложения для Android.
Но я смотрел разные сообщения, где упоминается, что REGEXP не поддерживается в Android Sqlite (например: link1, link2, link3).
Есть ли способ включить REGEXP в Android?
Если нет альтернатив для вышеуказанного SQL?
Спасибо,
EDIT: В настоящее время я получаю следующее исключение при использовании REGEXP в Android,
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]*')
)