查询语言的优先级是运营商还是优先于AND的优先级?

时间:2009-10-23 18:11:41

标签: language-agnostic programming-languages search-engine coding-style

传统上,大多数编程语言的优先级高于OR的优先级,因此表达式“a OR b AND c”被视为“OR(b AND c)”。遵循该想法搜索引擎和查询/寻址语言(css,xpath,sql,...)使用相同的优先级。这不是错吗?

当处理足够大的数据时,优先级划分是不方便的,因为它使得无法在不使用括号的情况下创建可重用的查询上下文。通过使用AND然后使用OR在该上下文中结合结果来创建上下文更方便。如果将空格用作AND运算符并将逗号用作OR运算符,则更方便。

实施例: 在11月或12月在互联网上搜索巴哈马的机票时,可以更方便地输入“十二月十二月十二号航空公司机票”,而不是“十一月巴哈马机票”,“十二月巴哈马机票”或“巴哈马机票”(十一月十二日)十二月)“

在CSS中,如果我们需要设置2个元素的样式红色,我们必须这样做:body.app1 div.d1 td.phone span.area,body.app1 div.d1 td.fax span.area {color: red}基本上复制前缀body.app1 div.d1和后缀span.area

如果OR的优先级高于AND,我们会在CSS中写这个:body.app1 div.d1 td.phone,td.fax span.area {color:red}

当然,这个想法可以发展成有两个运算符或一个优先级高于AND的运算符和一个运算符低的运算符,例如','更高,';'较低,但在许多情况下,语言没有备用符号来扩展,并且现有的优先级“,”它的使用率很低。

6 个答案:

答案 0 :(得分:9)

我宁愿在代码,SQL,搜索查询中保持一致性,这样我就不必记住它在这种特定情况下的方式。

答案 1 :(得分:9)

考虑到OR和AND的背景来自数学逻辑,它们具有明确定义的优先级,您不能在设计中违反该优先权而不会混淆VAST的大多数用户。

答案 2 :(得分:3)

我认为你忽略了运营商的优先级。它们仅仅是为了方便程序员/书籍作者。使用操作顺序使得某些子句可以在没有parens的情况下编写,但是使用parens可以确保读者确切地知道代码在做什么,特别是当不同的语言具有不同的操作顺序时。

答案 3 :(得分:3)

我不知道有任何语言可以做到这一点,但是如果没有括号将AND和OR结合起来应该是错误的。这是导致愚蠢错误的常见原因。

答案 4 :(得分:1)

当布尔运算符用于连接逻辑语句时,"和"运算符应优先于"或"。我认为令人困惑的是,许多查询语言隐含地形成了名词的逻辑陈述,但并未明确这些陈述是什么。

例如," foo& BAR"可能被解释为仅接受以下两个都为真的页面:

  1. 该页面包含与" foo"。
  2. 匹配的项目
  3. 该页面包含与" bar"。
  4. 匹配的项目

    查询" foo | BAR"可能被解释为评估上述条件并接受任何一个条件成立的页面,但它也可能被解释为涉及单个条件:

    1. 此页面包含与" foo"匹配的项目。或" bar"。
    2. 请注意,在简单的" foo |中BAR"如果选择哪种解释并不重要,但是给予" foo& moo | bar",如果不|运算符优先于&运算符,则不可能对foo & moo运算符采用后一种解释,除非将&解释为含义:

      1. 此页面包含与" foo"或" moo"。
      2. 如果foo* & *oot的参数包含通配符,则这种解释可能有意义(例如&&可能意味着单个项目必须以" foo"开头,并以&#结尾34; oot",而不是意味着页面必须有一个以" foo"开头的项目,以及一个以" oot")结尾的可能不同的项目,但没有这样的通配符,没有任何页面可以包含的项目都匹配" foo"和" moo",因此没有页面可以包含这样的项目。

        或许解决方案是让单独的运算符加入项目而不是加入页面。例如,如果&&!||&加入网页,则&!|foo && bar || moo && jar || quack && foo* | m* & *l &! *ll加入要匹配的内容,那么@import "compass/css3/filter"; // <-- Note 'filter', not 'filters' 将匹配包含&#34; foo&#34;和&#34; bar&#34;,每个包含&#34; moo&#34;的页面和&#34; jar&#34;以及包含单词&#34; quack&#34;的每个页面。并且还包含一个以&#34; foo&#34;开头的单词,或以&#34; m&#34;开头的单词,以&#34; l&#34;结尾,并且不以&结尾#34; 11&#34;

答案 5 :(得分:0)

具有讽刺意味的是,在您的第一个示例中,您隐式使用具有更高优先级的AND,因为

airline tickets bahama november

肯定会被理解为例如

.... WHERE transport = "AIR" AND target like "%bahamas%" AND month = "Nov"

这很好地暴露了你的想法的愚蠢。

关键是,如果优先级与它们相同,则总是可以提出更长的查询,并且使用备用优先级会更短。就像有可能提出算术表达式一样,如果加法的优先级高于乘法,则可以用较少的括号编写。但这本身并不足以改变这种行为。