СОДЕРЖИТ несколько терминов в нескольких столбцах - PullRequest
8 голосов
/ 10 февраля 2010

Я пытаюсь выполнить запрос CONTAINS с несколькими терминами в нескольких столбцах, например:

SELECT ID
FROM Table
WHERE CONTAINS((Data1,Data2,Data3), '"foo" & "bag" & "weee"')

Однако этот запрос не работает так, как я хочу: я хочу, чтобы он возвращал все записи, для которых все термины появляются хотя бы один раз хотя бы в одном из столбцов, например:

SELECT ID
FROM Table
WHERE CONTAINS((Data1,Data2,Data3), '"foo"')
AND CONTAINS((Data1,Data2,Data3), '"bag"')
AND CONTAINS((Data1,Data2,Data3), '"weee"')

Хотя этот запрос возвращает правильные результаты, для каждого термина требуется отдельное предложение AND. Есть ли способ выразить тот же запрос одним предложением where, как в верхнем примере? Это было бы удобно при включении запроса в (фиксированную) функцию.

1 Ответ

9 голосов
/ 10 февраля 2010

SQL Server когда-то вел себя таким образом, но это считалось ошибка и "исправлено".

Вам необходимо создать индекс FULLTEXT для вычисляемого столбца:

DROP TABLE t_ft
CREATE TABLE t_ft (id INT NOT NULL,
        data1 NVARCHAR(MAX) NOT NULL, data2 NVARCHAR(MAX) NOT NULL, data3 NVARCHAR(MAX) NOT NULL,
        totaldata AS data1 + ' ' + data2 + ' ' + data3,
        CONSTRAINT pk_ft_id PRIMARY KEY (id))

CREATE FULLTEXT INDEX ON t_ft (totaldata LANGUAGE 1033) KEY INDEX pk_ft_id

INSERT
INTO    t_ft
VALUES  (1, 'foo bar', 'baz', 'text')

INSERT
INTO    t_ft
VALUES  (2, 'foo bar', 'bax', 'text')


SELECT  *
FROM    t_ft
WHERE   CONTAINS (*, 'foo AND baz') 

В MySQL, наоборот, полнотекстовый индекс выполняет поиск и сопоставление во всех столбцах, что является задокументированным поведением.

...