1

投稿のタイトルが悪くて申し訳ありませんが、これをうまく要約できませんでした。

例を使用することをお勧めします。2 つのテキスト列を持つこの単純なテーブルがあるとします (他の列は除外しています)。

Id    Text_1  Text_2
1     a       a b
2     c       a b

「b」ではなく「a」を検索したい場合、現在の実装ではレコード 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

ロジックは各レコードに対して評価されるため、行内の 1 つのレコードからの除外ヒットでその行を除外したい場合はNOT 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 に答える