2013-08-28 4 views
0

Я ищу значения с знаком с точкой с запятой (;). Поэтому у меня есть:Как найти значение, которое включает знак с запятой (;) в SQLite?

SELECT * FROM table WHERE value MATCH '; "+lookingFor+"*' 

Это дает логическую ошибку в SQLite. Как объяснить программе ";" не для того, чтобы разбить код на кусок? Что я делаю неправильно?

PS. Пример значение столбца:

apple; orange; banana 
pineapple; watermelon 

Это запрос:

query = "SELECT id AS _id, 
entry_id , 
re_value, 
ke_value, 
g_value 
FROM search_eng_fts 
WHERE g_value MATCH '" 
+ lookingFor+ "* OR 
; "+lookingFor+"*' 
ORDER BY length(g_value) 
LIMIT 100"; 
+0

вы можете вставить код, который вы используете для выполнения запроса! –

+0

добавлен актуальный запрос –

ответ

2

Следующая SQL работает:

SELECT * FROM list WHERE value like '%; banana%' 

SQL Fiddle

Хотя вы можете принять меры, чтобы избежать инъекции SQL

+0

LIKE очень медленно в моей ситуации. Как использовать это с MATCH? –

+0

FTS игнорирует знаки пунктуации. Вам нужно будет написать свой собственный токенизатор, но это невозможно для Android. –

+0

Хорошо! Это то, что я хочу! Теперь я знаю, что я не могу найти слова по точкам с запятой. –

2

Согласно SQLite docs

оператору MATCH специальный синтаксис для применения функции, определенной матч(). Реализация функции match() по умолчанию вызывает исключение и ничем не полезна. Но расширения могут переопределить функцию match() с более полезной логикой.

Вы считали, что не сохраняете значения в виде разделительной строки и вместо этого используете реляционную базу данных, как и предполагалось, поэтому каждое значение имеет свою собственную строку в новой таблице.

например Вместо

T

TID  Name  Value 
1  Test  apple; orange; banana 
2  Test2  pineapple; watermelon 

У вас есть 2 таблицы,

T - Для хранения ключевой информации

TID  Name 
1  Test 
2  Test2 

TValues ​​ - Для сохранения значения со ссылкой назад T

TID  Name 
1  apple 
1  orange 
1  banana 
2  pineapple 
2  watermelon 

Таким образом, ваш запрос становится просто:

SELECT T.TID, T.Name, TValues.Name 
FROM T 
     INNER JOIN TValues 
      ON T.TID = TValues.TID 
WHERE TValues.Name = 'apple'; 

Если вам нужно вернуться к одной строке можно использовать GROUP_CONCAT в SQLite:

SELECT T.TID, T.Name, GROUP_CONCAT(TValues.Name, '; ') AS Value 
FROM T 
     INNER JOIN TValues 
      ON T.TID = TValues.TID 
GROUP BY T.TID, T.Name; 

Examples on SQL Fiddle

+0

Спасибо вам! Однако я имел в виду еще одну вещь ... –