1

次のシナリオで全文検索を行っています。

指定した用語を正確に含む行を探したいのですが、それ以上のものはありません。

私の列は次のようになります。

        Col1
        apples oranges grapes
        apples oranges
        apples strawberries
        apples strawberries peaches
        apples

しかし、リンゴやイチゴを含む行のみを検索し、他には何も検索したくない

私の結果は次のようになります。

1| apples strawberries
2| apples 

ありがとうございました :)

4

2 に答える 2

0

ここでtable1Col1がどこで機能するかはよくわかりません。そのため、以下は問題を完全に解決するには十分ではないかもしれませんが、開始する必要があります。

まず、次のような分割関数が必要です。

CREATE FUNCTION dbo.Split (@Input NVARCHAR(MAX), @Delimiter NVARCHAR(1))
RETURNS @T TABLE (OutputValue NVARCHAR(MAX))
AS
BEGIN

    WITH CTE AS
    (   SELECT  [OutputValue] = SUBSTRING(@Input, 1, CHARINDEX(@Delimiter, @Input)), 
                [InputValue] = SUBSTRING(@Input, CHARINDEX(@Delimiter, @Input) + 1, LEN(@Input)) + ' '
        UNION ALL 
        SELECT  [OutputValue] = SUBSTRING([InputValue], 1, CHARINDEX(@Delimiter, [InputValue])), 
                [InputValue] = SUBSTRING([InputValue], CHARINDEX(@Delimiter, [InputValue]) + 1, LEN([InputValue]))
        FROM    CTE
        WHERE   LEN([InputValue]) > 0
    )
    INSERT @T
    SELECT  DISTINCT OutputValue
    FROM    CTE

    RETURN;
END

次に、次のようなものを使用できます。

DECLARE @T TABLE (Col1 NVARCHAR(MAX));
INSERT @T VALUES ('apples oranges grapes'), ('apples oranges'), ('apples strawberries');

DECLARE @StringToCheck NVARCHAR(MAX) = 'apples oranges bananas grapes'

SELECT  Col1
FROM    @T
        CROSS APPLY dbo.Split(Col1, ' ') spl
        LEFT JOIN dbo.Split(@StringToCheck, ' ') chk
            ON chk.OutputValue = spl.OutputValue
GROUP BY Col1
HAVING COUNT(spl.OutputValue) = COUNT(chk.OutputValue)

または、アイテムを明確に除外する必要がある場合

DECLARE @T TABLE (Col1 NVARCHAR(MAX));
INSERT @T VALUES ('apples oranges grapes'), ('apples oranges'), ('apples strawberries');

DECLARE @StringToCheck NVARCHAR(MAX) = 'apples oranges bananas grapes',
        @StringToExlude NVARCHAR(MAX) = 'strawberries grapes'

SELECT  Col1
FROM    @T
        CROSS APPLY dbo.Split(Col1, ' ') spl
        LEFT JOIN dbo.Split(@StringToCheck, ' ') chk
            ON chk.OutputValue = spl.OutputValue
        LEFT JOIN dbo.Split(@StringToExlude, ' ') exc
            ON exc.OutputValue = spl.OutputValue
GROUP BY Col1
HAVING  COUNT(spl.OutputValue) = COUNT(chk.OutputValue)
AND     COUNT(exc.OutputValue) = 0
于 2012-10-25T16:29:49.713 に答える
0

たくさん遊んだ後、自分でそれを理解しました:(私が抱えていた本当の問題を明らかにするために質問を編集しました):

   SELECT * FROM Table WHERE CONTAINS(Col1, 'apples or strawberries')
                           AND (Col1 NOT LIKE '%[^ apples or strawberries ]%');
于 2012-10-25T20:56:49.900 に答える