2010-10-30 3 views
13

Допустим, у меня есть таблица со столбцами A, B, C, D, и я хочу сделать матч на колонке A и CКак вы сопоставляете несколько столбцов в таблице с SQLite FTS3?

Я вижу, что вы можете либо соответствовать один столбец или все столбцы в SQLite, т.е.

- match column A 
select * from table where A match 'cat' 

- match all columns 
select * from table where table match 'cat' 

Можно ли совместить только столбцы A и C? Если нет, как вы, ребята, обходите это?

Спасибо за ваше предложение!

ответ

24

Я не думаю, что вы можете использовать несколько операторов MATCH в одном запросе FTS. Используйте column_name: target_term для поиска нескольких столбцов, используя один полнотекстовый поиск.

SELECT * FROM table WHERE table MATCH 'A:cat OR C:cat' 

http://www.sqlite.org/fts3.html#termprefix

+0

Что делать, если кошка содержит 'OR'? как уйти от него? – Alex

+0

@Alex FTS ищет все термины, а не подстроки, поэтому нет необходимости скрывать что-то вроде «A: poor OR C: or». И ИЛИ НЕ должны быть в верхнем регистре, условия строчные. http://www.sqlite.org/fts3.html#section_3_1 –

+0

По какой-то странной причине: SELECT * FROM table WHERE table MATCH "field: v.sport 1" дает мне разные результаты из SELECT * FROM table WHERE field MATCH " v.sport 1 ", данный« V.sport 1 »- мой поисковый запрос. – kroe

-1

Вы можете объединить столбцы, используя || Оператор:

SELECT * FROM table WHERE a || b MATCH 'cat' 

Я не уверен, о функции MATCH в SQLite, хотя, я думаю, что это, как правило, сгенерирует исключение (см http://www.sqlite.org/lang_expr.html#match).

+2

Нет, SQLite не кажется, нравится, что, хотя вы можете вернуть CONCATENATE столбец т.е. выбрать || b из таблицы, где совпадение «cat» – Unikorn

+0

Какое преимущество оператора здесь? Матч или ||? Попробуйте скобки. – MPelletier

+1

На самом деле, я заметил, что вы можете сделать что-то вроде этого: выберите * из таблицы, где столбец соответствует «colA: cat OR colB: cat», но производительность ужасна по сравнению с cola и colB в одном столбце и делает совпадение с Это. – Unikorn

7

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

-- 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 
+0

как насчет того, когда выражение MATCH неизвестно, поэтому с java pst.setString(), как бы изменилось утверждение? – Hoody

+0

Ни один из примеров, которые вы только что скопировали из документов, работает, как вы утверждаете, что они есть. Столбец всегда указывается в каждом. – DoTheEvo

2

Использование подзапросов в качестве временного решения:

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' 
    ) 
); 
3

Для условия несколько колонок с помощью использования MATCH UNION для «OR» и использовать INTERSECT для «И»

SELECT * FROM TBL_VIRTUAL_APPOINTMENT WHERE PATIENT_PREFIX MATCH 'D*' 
UNION 
SELECT * FROM TBL_VIRTUAL_APPOINTMENT WHERE patient_first_name MATCH 'K*' 
Смежные вопросы