SQL FTS и операторы сравнения
Короткий рассказ. Я работаю над проектом, где мне нужно общаться с базой данных SQLite. И там у меня есть несколько проблем:
Существует одна таблица FTS со столбцами nodeId и nodeName. Мне нужно выбрать все nodeIds, для которых nodeNames содержит текстовый шаблон. Например, все имена узлов с "Дональдом" внутри. Нечто подобное обсуждалось в этой теме. Дело в том, что я не могу использовать ключевое слово CONTAINS. Вместо этого я использую MATCH. И вот вопрос сам по себе: как эта "строка Дональда" должна быть "подставлена"? С символом "*" или с символом "%"? Вот мой запрос:
SELECT * FROM nodeFtsTable WHERE nodeName MATCH "Donald"
Можно ли написать множественное сравнение в операторе SELECT? Я имею в виду что-то вроде этого:
SELECT * FROM distanceTable WHERE pointId = 1 OR pointId = 4 OR pointId = 203 AND distance<200
Я надеюсь, что это не звучит очень запутанно. Заранее спасибо!
1 ответ
Изменить: Извините, я пропустил тот факт, что вы используете FTS4. Похоже, вы можете просто сделать это:
SELECT * FROM nodeFtsTable WHERE nodeName MATCH 'Donald'
Вот соответствующая документация.
Для сопоставления всех записей, в которых Donald
это дискретное слово (например, выше будет соответствовать Donald Duck
). Если вы хотите соответствовать Donald
как часть слова (например, Donalds
) тогда нужно использовать *
в соответствующем месте:
SELECT * FROM nodeFtsTable WHERE nodeName MATCH 'Donald*'
Если ваш запрос не работал, возможно, вы использовали двойные кавычки.
Оператор MATCH - это специальный синтаксис для определенной в приложении функции match(). Реализация функции match() по умолчанию вызывает исключение и ни к чему не приводит. Но расширения могут переопределить функцию match() с более полезной логикой.
FTS4 является расширением, которое обеспечивает match()
функция.
Да, можно использовать несколько условий, как во втором запросе. Если у вас сложный набор условий, важно понимать порядок, в котором условия будут оцениваться. AND
всегда оценивается раньше OR
(они аналогичны математическому умножению и сложению соответственно). На практике я думаю, что всегда лучше использовать круглые скобки для ясности при использовании комбинации AND
а также OR
:
--This is the same as with no parentheses, but is clearer:
SELECT * FROM distanceTable WHERE
pointId = 1 OR
pointId = 4 OR
(pointId = 203 AND distance<200)
--This is something completely different:
SELECT * FROM distanceTable WHERE
(pointId = 1 OR pointId = 4 OR pointId = 203) AND
distance<200