【问题标题】:Why is "or not" and "not" not allowed in Contains (tsql)?为什么包含(sql)中不允许“或不”和“不”?
【发布时间】:2014-02-19 22:17:27
【问题描述】:

我已经搜索过 tsql 包含不允许“或不”或“不”作为一元运算符的原因。

在微软网站上它只是说“不允许使用 OR NOT 运算符” CONTAINS (Transact-SQL)

我可以简单地将一元不放在 contains 之外就可以做到这一点吗?

SELECT * FROM Person 
WHERE NOT CONTAINS(*, 'Steve')

和“或不”一样

SELECT * FROM Person 
WHERE CONTAINS(FirstName, 'Peter') OR NOT CONTAINS(LastName, 'Smith')

像上面两个例子那样做查询有问题吗?

感谢您的帮助
曼努埃尔

【问题讨论】:

    标签: tsql full-text-search contains full-text-indexing


    【解决方案1】:

    您是否有特定的理由在您的情况下进行全文搜索?

    在您的示例中,您可能希望将查询简化为以下内容:

    SELECT * FROM Person
    WHERE FirstName LIKE '%Peter%' OR LastName NOT LIKE '%Smith%'
    

    如果您需要使用全文搜索,您可以将查询更改为以下内容:

    SELECT * FROM Person 
    WHERE CONTAINS(FirstName, 'Peter')
    
    EXCEPT
    
    SELECT * FROM Person 
    WHERE CONTAINS(LastName, 'Smith')
    

    【讨论】:

    • 但这比 `WHERE CONTAINS(FirstName, 'Peter') OR NOT CONTAINS(LastName, 'Smith') 一行要麻烦得多
    • 我正在使用全文,因为在我的情况下用户正在搜索。用户输入“Peter OR NOT Smith”之类的内容,我将其转换为查询
    【解决方案2】:

    你的例子应该有效。

    CONTAINS( Description, 'NOT "Mountain" ') 这样的表达式可能是不允许的,因为它等同于(我们可以重写)NOT CONTAINS( Description, 'Mountain')。

    类似地,CONTAINS( Description, '"River" OR NOT "Mountain" ') 这样的表达式等价于CONTAINS( Description, 'River') OR NOT CONTAINS( Description, 'Mountain')。

    【讨论】:

    • 据我了解 Contains(*, 'Mountain AND River') 返回的结果与 Contains(*, 'Mountain') AND Contains( *, 'River') 但执行时不等价
    • 我指的是逻辑等价,当然,这与每个查询的执行方式无关。但在这种简单的情况下,无论如何执行时间都不应该有任何差异。
    猜你喜欢
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多