Question

Je suis en train d'effectuer une requête CONTAINS avec des termes multiples sur plusieurs colonnes, comme ceci:

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

Cependant, cette requête ne se comporte pas comme je veux que ça: je veux revenir tous les enregistrements pour lesquels tous les termes apparaissent au moins une fois dans au moins l'une des colonnes, comme ceci:

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

Bien que cette requête renvoie les résultats corrects, il a besoin d'un séparé et article pour chaque terme. Y at-il un moyen d'exprimer la même requête avec une seule clause where comme dans l'exemple supérieur? Ce serait pratique si l'on inclut la requête dans une fonction (fixe).

Était-ce utile?

La solution

SQL Server une fois se comportait de cette façon, mais il a été considéré comme un bug et "corrigée".

Vous devez créer un index de FULLTEXT sur une colonne calculée:

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

En MySQL, au contraire, les recherches d'index de texte intégral et les matches dans toutes les colonnes, ce qui est un comportement documenté.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top