我正在尝试在多个列上执行包含多个术语的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子句表达相同的查询?将查询包含在(固定)函数中时,这将很方便。
答案 0 :(得分:9)
SQL Server
曾经这样做过,但它被认为是bug并且“已更正”。
您需要在计算列上创建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
中,全文索引会在所有列中进行搜索和匹配,这是一种记录在案的行为。