2015-01-30 2 views
8

Я хотел бы, чтобы достичь следующего (полнотекстовый поиск),Как достичь границы слова в 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 'помощь s следующий то, что я использую (после некоторых модификаций)

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]*') 
) 
+0

попробовать это ' \ ' –

ответ

8

В самом деле поддержки REGEXP, вам придется добавить свой собственный regexp() user function.

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

Если ваши рисунки очень просты, GLOB operator может быть достаточно хорош.

Например, чтобы выполнить поиск, эквивалентный этому запросу MYSQL:

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.

Наконец, если «какой-то строка» относительно редко в 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'); 
Смежные вопросы