2014-09-11 3 views
2

Я работаю с Java, и у меня есть db, SQLite 3.8.5, с 2 столбцами, ID(int key) и note(string). Я хочу иметь возможность запрашивать все заметки, содержащие несколько слов.SQLite-запрос с регулярным выражением

Пример: Note1: "Привет, этот фильм Foo"
Примечание2: "Привет, этот фильм желтый"
Note3: (! Yoda, не печатайте) "Здравствуйте, Foo этот фильм"
Учитывая фильтр слов пользователя: «Foo» «фильм»

Результат от запроса должен быть Примечания 1 и 2.

Это регулярное выражение работает, но я не могу показаться, чтобы найти, как задать регулярное выражение в качестве запроса: .*(?=.*movie)(?=.*foo).*

BR

ответ

0

У SQLite есть оператор REGEXP, который вы используете для сравнения значений. Проблема в том, что по умолчанию SQLite не обеспечивает реализацию для регулярного сравнения expresion, поэтому вы должны ее предоставить. Это делается путем реализации пользовательской функции SQL regexp().

Чтобы узнать, как реализовать пользовательские функции SQL, см: Writing user defined SQL functions for SQLite using Java or Groovy?

Другими словами, вы должны сказать SQLite, как он должен выполнять регулярные выражения, обеспечивая функцию Java, которая делает работу.

После того как вы внедрили функцию regexp, вы можете начать использовать оператор REGEXP в SQL-запросах.

3

В дополнение к ответу выше, решение на Java, для полноты. Вам нужно будет сделать это для каждого соединения, где должен работать оператор REGEXP.

   // Create regexp() function to make the REGEXP operator available 
       Function.create(connection, "REGEXP", new Function() { 
        @Override 
        protected void xFunc() throws SQLException { 
         String expression = value_text(0); 
         String value = value_text(1); 
         if (value == null) 
          value = ""; 

         Pattern pattern=Pattern.compile(expression); 
         result(pattern.matcher(value).find() ? 1 : 0); 
        } 
       }); 
Смежные вопросы