CONTAINS 在多列中包含多个术语

Posted

技术标签:

【中文标题】CONTAINS 在多列中包含多个术语【英文标题】:CONTAINS with multiple terms over multiple columns 【发布时间】:2011-01-15 07:09:27 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于CONTAINS 在多列中包含多个术语的主要内容,如果未能解决你的问题,请参考以下文章

删除熊猫中多列中包含一段字符串的所有行

pandas删除dataframe列名称中包含特定字符串的数据列(dropping columns contains specifiec substring in dataframe)

java中怎么判断一个字符串中包含某个字符或字符串

在 Android 中查找路径中包含的点

C#中如何判断字符串中包含某个字符?

在 Pandas 中为列名包含模式的多列过滤 DataFrame