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).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top