包含多个列中的多个术语

问题描述 投票:0回答:2

我正在尝试对多个列执行包含多个术语的 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 contains
2个回答
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
中,相反,全文索引在所有列中搜索和匹配,这是一个记录的行为。


0
投票

根据天蓝色文档。 https://learn.microsoft.com/en-us/sql/t-sql/queries/contains-transact-sql?view=sql-server-ver16

您可以通过指定要搜索的列的列表来查询多列。这些列必须来自同一个表。

例如,以下 CONTAINS 查询在 AdventureWorks2022 示例数据库的 Production.Product 表的 Name 和 Color 列中搜索术语 Red

使用 AdventureWorks2022;
去吧
选择名称、颜色
来自生产.产品
WHERE CONTAINS((名称,颜色),'红色');

© www.soinside.com 2019 - 2024. All rights reserved.