Как вы сопоставляете несколько столбцов в таблице с SQLite FTS3?
Предположим, что у меня есть таблица со столбцами A, B, C, D, и я хочу сделать совпадение в столбцах A и C
Я вижу, что вы можете либо сопоставить один столбец, либо весь столбец в sqlite, т.е.
- match column A
select * from table where A match 'cat'
- match all columns
select * from table where table match 'cat'
Можно ли совместить только столбцы A и C? Если нет, как вы, ребята, обойдете это?
Спасибо за ваше предложение!
Ответы
Ответ 1
Я не думаю, что вы можете использовать несколько операторов MATCH в одном запросе FTS. Используйте column_name: target_term для поиска нескольких столбцов, используя один полнотекстовый поиск.
SELECT * FROM table WHERE table MATCH 'A:cat OR C:cat'
http://www.sqlite.org/fts3.html#termprefix
Ответ 2
Вместо того, чтобы указывать, к какому столбцу нужно сопоставить, вы можете указать всю таблицу, в которой она соответствует. Например:
-- Example schema
CREATE VIRTUAL TABLE mail USING fts3(subject, body);
-- Example table population
INSERT INTO mail(docid, subject, body) VALUES(1, 'software feedback', 'found it too slow');
INSERT INTO mail(docid, subject, body) VALUES(2, 'software feedback', 'no feedback');
INSERT INTO mail(docid, subject, body) VALUES(3, 'slow lunch order', 'was a software problem');
-- Example queries
SELECT * FROM mail WHERE subject MATCH 'software'; -- Selects rows 1 and 2
SELECT * FROM mail WHERE body MATCH 'feedback'; -- Selects row 2
SELECT * FROM mail WHERE mail MATCH 'software'; -- Selects rows 1, 2 and 3
SELECT * FROM mail WHERE mail MATCH 'slow'; -- Selects rows 1 and 3
Ответ 3
Для условия множественного столбца с использованием MATCH используйте UNION для "OR" и используйте INTERSECT для "AND"
SELECT * FROM TBL_VIRTUAL_APPOINTMENT WHERE PATIENT_PREFIX MATCH 'D*'
UNION
SELECT * FROM TBL_VIRTUAL_APPOINTMENT WHERE patient_first_name MATCH 'K*'
Ответ 4
Использование подзапросов в качестве обходного пути:
OR
эквивалентный запрос, например a MATCH 'cat' OR c MATCH 'cat'
:
SELECT * FROM table
WHERE ROWID IN (
SELECT ROWID FROM table WHERE a MATCH 'cat'
UNION
SELECT ROWID FROM table WHERE b MATCH 'cat'
);
AND
эквивалентный запрос, например a MATCH 'cat' AND c MATCH 'cat'
:
SELECT * FROM table WHERE ROWID IN (
SELECT ROWID FROM table WHERE a MATCH 'cat'
AND ROWID IN (
SELECT ROWID FROM table WHERE b MATCH 'cat'
)
);
Ответ 5
Вы можете объединить столбцы, используя || Оператор:
SELECT * FROM table WHERE a || b MATCH 'cat'
Я не уверен в функции MATCH в SQLite, хотя, я думаю, что она обычно генерирует исключение (см. http://www.sqlite.org/lang_expr.html#match).