sql - CONTAINS 在多列中包含多个术语

标签 sql contains

我正在尝试对多个列执行包含多个术语的 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 子句来表达相同的查询?当将查询包含在(固定)函数中时,这会很方便。

最佳答案

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 中,全文索引在所有列中搜索和匹配,这是记录的行为。

关于sql - CONTAINS 在多列中包含多个术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2237443/

相关文章:

sql - 您认为地址表中列的最佳平衡是什么?

c# - 如何检查 List<T> 元素是否包含具有特定属性值的项目

sql - 获取 n 个分组类别并将其他类别加总为一个

c# - 如何使用实用程序类管理 SQL 连接?

sql - 从不同的表中获取 XML

mysql - 选择数据间隔

xml - XPath: contains(./text(), 'str' ) 将只查看第一个文本后代

java - 包含在 TreeSet 上与另一个 Set

java - String.contains 总是显示 false

jQuery:将 "Filter"转换为 "Contains"以获得文本字符串的更多匹配项