首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SELECT语句SQL Server (全文)类似于“CONTAINS(CONTAINS,'term1 or term 2 or term3') AND NOT (anything )”

SELECT语句SQL Server (全文)类似于“CONTAINS(CONTAINS,'term1 or term 2 or term3') AND NOT (anything )”
EN

Stack Overflow用户
提问于 2012-10-25 05:46:46
回答 2查看 512关注 0票数 1

我在下面的场景中进行了全文搜索:

我想查找完全包含我指定的术语的行,而不是更多。

我的专栏如下所示:

代码语言:javascript
复制
        Col1
        apples oranges grapes
        apples oranges
        apples strawberries
        apples strawberries peaches
        apples

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

我的结果如下所示:

代码语言:javascript
复制
1| apples strawberries
2| apples 

谢谢您:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-26 04:56:50

经过多次尝试,我自己弄明白了:(我还编辑了问题,以揭示我遇到的真正问题):

代码语言:javascript
复制
   SELECT * FROM Table WHERE CONTAINS(Col1, 'apples or strawberries')
                           AND (Col1 NOT LIKE '%[^ apples or strawberries ]%');
票数 0
EN

Stack Overflow用户

发布于 2012-10-26 00:29:50

我真的不确定你的table1Col1在这里起什么作用,所以下面的可能不足以完全解决你的问题,但它应该能让你入门:

首先,您需要一个split function,例如:

代码语言:javascript
复制
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

然后,您可以使用类似以下内容:

代码语言:javascript
复制
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)

或者如果您需要专门排除项目

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13058286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档