【问题标题】:SQL - Combining AND & ORSQL - 结合 AND & OR
【发布时间】:2016-04-13 02:24:02
【问题描述】:

我有以下代码:

SELECT sdd.sd_doc_classification,
       sdd.sd_title,
       sdd.sd_desc,
       sdr.sd_upload_fname
FROM sdoc_docs AS sdd
INNER JOIN sdoc_revh AS sdr ON sdd.sd_id = sdr.sd_id
WHERE (sdd.sd_title LIKE '%policy%')
    OR (sdd.sd_title LIKE '%guideline%')
    AND (sdd.sd_doc_classification NOT LIKE '%\Trust Wide Policies & Guidelines\%')

但是,添加“OR (sdd.sd_title LIKE '%guideline%')”会破坏它,并且该语句现在返回的值类似于'%\Trust Wide Policies & Guidelines\%'

删除上面的指南示例后,代码按预期运行。

基本上我想显示任何有sd_title 的东西,比如policyguideline,而没有sd_doc_classification 的东西,比如'%trust wide pol%'

【问题讨论】:

  • 正确使用括号即可。
  • 当你混合ANDOR 时,你应该总是添加括号。优先级为NOT-AND-OR

标签: sql sql-server database select boolean-logic


【解决方案1】:

正如 Gordon 和 dnoeth 所指出的,您的括号是问题所在。我认为您实际上需要以下查询。

SELECT sdd.sd_doc_classification,
       sdd.sd_title,
       sdd.sd_desc,
       sdr.sd_upload_fname
FROM sdoc_docs AS sdd
INNER JOIN sdoc_revh AS sdr ON sdd.sd_id = sdr.sd_id
WHERE 
    (
        sdd.sd_title LIKE '%policy%'
        OR 
        sdd.sd_title LIKE '%guideline%'
    )
    AND 
    sdd.sd_doc_classification NOT LIKE '%\Trust Wide Policies & Guidelines\%'

我发现正确地标出不同的 OR 和 AND 子句清楚地使它们更易于可视化和理解。

【讨论】:

  • 这也有效,而且很有意义。我现在可以看到我做错了什么。谢谢!
【解决方案2】:

ANDOR 具有更高的优先级 - 也就是说,就好像您这样编写查询:

SELECT sdd.sd_doc_classification,
       sdd.sd_title,
       sdd.sd_desc,
       sdr.sd_upload_fname
FROM       sdoc_docs AS sdd
INNER JOIN sdoc_revh AS sdr ON sdd.sd_id = sdr.sd_id
WHERE      (sdd.sd_title LIKE '%policy%') OR 
           ((sdd.sd_title LIKE '%guideline%') AND 
            (sdd.sd_doc_classification NOT LIKE 
             '%\Trust Wide Policies & Guidelines\%')) 

如果您想控制条件评估的优先级,您可以自己显式添加括号:

SELECT sdd.sd_doc_classification,
       sdd.sd_title,
       sdd.sd_desc,
       sdr.sd_upload_fname
FROM       sdoc_docs AS sdd
INNER JOIN sdoc_revh AS sdr ON sdd.sd_id = sdr.sd_id
WHERE      ((sdd.sd_title LIKE '%policy%') OR 
            (sdd.sd_title LIKE '%guideline%')) AND 
           (sdd.sd_doc_classification NOT LIKE 
             '%\Trust Wide Policies & Guidelines\%')

【讨论】:

  • 这行得通,而且现在很有意义。谢谢!
猜你喜欢
  • 2018-08-10
  • 2018-06-03
  • 1970-01-01
  • 2012-11-03
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 2020-12-17
相关资源
最近更新 更多