1

抱歉帖子标题不好,但我无法更好地总结这一点。

最好举个例子。假设我有一个包含两个文本列的简单表格(我将其他列排除在外)。

Id    Text_1  Text_2
1     a       a b
2     c       a b

现在,如果我想搜索“a”而不是“b”,在我当前的实现中,我将返回记录 1。我明白为什么会这样,这是因为搜索条件是“Text_1”列的匹配项,而对于记录 2,它不是任何列的匹配项。

但是,对于最终用户来说,这可能并不直观,因为他们可能意味着在大多数情况下也要排除记录 1。

所以我的问题是,如果我想告诉 SQL Server“跨所有列”进行匹配(这意味着如果在任何列上找到“NOT”部分,则记录不应该匹配),这可能吗?

编辑:这就是我的查询对于这个例子的样子:

SELECT Id, TextHits.RANK Rank, Text_1, Text_2 FROM simple_table
JOIN CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a" and not "b"') TextHits
ON TextHits.[KEY] = simple_table.Id
ORDER BY Rank DESC

实际的查询有点复杂(更多的列,更多的连接等),但这是一般的想法:)

谢谢!

4

1 回答 1

1

该逻辑将针对每条记录进行评估,因此如果您希望从一行中的一条记录中排除命中以导致对该行的排除,您应该使用 aNOT EXISTS并将全文查询分解为单独的包含和排除部分......

SELECT  Id, 
        TextHits.RANK Rank, 
        Text_1, 
        Text_2 
FROM    simple_table
JOIN    CONTAINSTABLE(simple_table, (Text_1, Text_2), '"a"') TextHits
        ON  TextHits.[KEY] = simple_table.Id
WHERE   NOT EXISTS (SELECT  1
                    FROM    CONTAINSTABLE(simple_table, (Text_1, Text_2), '"b"') exclHits
                    WHERE   TextHits.[KEY] = exclHits.[KEY])
ORDER BY Rank DESC
于 2013-04-01T16:32:35.157 回答