CONTÉM com vários termos mais de várias colunas
Pergunta
Eu estou tentando executar uma consulta contém com vários termos mais de várias colunas, como este:
SELECT ID
FROM Table
WHERE CONTAINS((Data1,Data2,Data3), '"foo" & "bag" & "weee"')
No entanto, esta consulta não se comporta como eu quero que ele: eu quero que retornar todos os registros para o qual todos os termos aparecem pelo menos uma vez em pelo menos uma das colunas, como este:
SELECT ID
FROM Table
WHERE CONTAINS((Data1,Data2,Data3), '"foo"')
AND CONTAINS((Data1,Data2,Data3), '"bag"')
AND CONTAINS((Data1,Data2,Data3), '"weee"')
Enquanto esta consulta retorna os resultados corretos, ele precisa de um E-cláusula separada para cada termo. Existe uma maneira de expressar a mesma consulta com um único onde cláusula como no exemplo superior? Isso seria conveniente quando incluindo a consulta em uma função (fixo).
Solução
SQL Server
uma vez se comportou desta maneira, mas foi considerado um bug e "corrigido".
Você precisa criar um índice FULLTEXT
em uma coluna computada:
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')
Em MySQL
, pelo contrário, as pesquisas de texto completo de indexação e partidas em todas as colunas e este é um comportamento documentado.