Подтвердить что ты не робот

Как достичь границы слова в Sqlite Android?

Я хотел бы получить следующее (полнотекстовый поиск),

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]*')
)
4b9b3361

Ответ 1

Чтобы на самом деле поддерживать REGEXP, вам придется добавить свою собственную функцию regexp().

Эта ссылка может помочь вам разобраться, как создавать пользовательские функции, в общем, для Android - но это не просто.

Если ваши шаблоны очень просты, columnname, тогда следующий более длинный запрос может быть быстрее, так как он будет выполнять только несколько оценок 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');