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*'

Если ваш запрос не работал, возможно, вы использовали двойные кавычки.

Из документации по SQLite:

Оператор 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
Другие вопросы по тегам