Как сопоставить несколько столбцов в таблице с SQLite FTS3? - PullRequest
15 голосов
/ 30 октября 2010

Допустим, у меня есть таблица со столбцами 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?Если нет, то как вы, ребята, справляетесь с этим?

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

Ответы [ 5 ]

29 голосов
/ 30 января 2013

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

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

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

6 голосов
/ 10 августа 2011

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

-- 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
5 голосов
/ 06 сентября 2016

Для условия с несколькими столбцами, использующего MATCH, используйте UNION для ИЛИ и INTERSECT для И

SELECT * FROM TBL_VIRTUAL_APPOINTMENT WHERE PATIENT_PREFIX MATCH 'D*' 
UNION 
SELECT * FROM TBL_VIRTUAL_APPOINTMENT WHERE patient_first_name MATCH 'K*'
2 голосов
/ 27 августа 2013

Использование подзапросов в качестве обходного пути:

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'
    )
);
0 голосов
/ 30 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...