对于糟糕的帖子标题感到抱歉,但我无法总结这一点。
最好使用一个例子。说我有这个简单的表有两个文本列(我将其他列留下)。
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
实际查询有点复杂(更多列,更多连接等),但这是一般的想法:)
谢谢!
答案 0 :(得分:1)
将针对每条记录对逻辑进行评估,因此如果您希望从一行中的一个记录中排除命中以排除该行,则应使用NOT EXISTS
并将fullText查询分解为单独的包容性和排他性的部分......
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