2010-02-10 24 views
8

Estoy intentando realizar una consulta CONTAINS con múltiples términos a través de múltiples columnas, así:CONTIENE con múltiples términos en múltiples columnas

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

Sin embargo, esta consulta no se comporta como yo quiero que: I queremos que devolver todos los registros en los que todos los términos aparecen al menos una vez en al menos una de las columnas, así:

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

Si bien esta consulta devuelve los resultados correctos, se necesita un E-cláusula separada para cada plazo . ¿Hay alguna manera de expresar la misma consulta con una sola cláusula where como en el ejemplo superior? Esto sería conveniente cuando se incluye la consulta en una función (fija).

Respuesta

9

SQL Server una vez que se comportó de esta manera, pero se consideró un bug y "corregido".

Es necesario crear un índice FULLTEXT en una columna calculada:

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, por el contrario, las búsquedas de índice de texto completo y partidos en todas las columnas y esto es un comportamiento documentado.

+1

Wow .. Increíble. Gracias. – dbaw

Cuestiones relacionadas