【问题标题】:SELECT statement SQL Server (full text) similar to "CONTAINS(column, 'term1 or term 2 or term3') AND NOT (anything else)"SELECT 语句 SQL Server(全文)类似于“CONTAINS(column, 'term1 or term 2 or term3') AND NOT (anything else)”
【发布时间】:2012-10-15 00:41:06
【问题描述】:

我有一个全文搜索与以下场景:

我想查找包含我指定的术语的行,仅此而已。

我的专栏是这样的:

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

但我只想搜索包含苹果和/或草莓的行,而不是别的

我的结果将如下所示:

1| apples strawberries
2| apples 

谢谢你:)

【问题讨论】:

标签: sql full-text-search contains


【解决方案1】:

我不太确定你的 table1Col1 在这里发挥作用,所以下面可能不足以完全解决你的问题,但它应该让你开始:

首先你需要一个split function,如:

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

【讨论】:

    【解决方案2】:

    在玩了很多之后自己弄清楚了:(还编辑了问题以揭示我遇到的真正问题):

       SELECT * FROM Table WHERE CONTAINS(Col1, 'apples or strawberries')
                               AND (Col1 NOT LIKE '%[^ apples or strawberries ]%');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 2021-10-27
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      相关资源
      最近更新 更多