【问题标题】:Should query languages have priority of operator OR higher than priority of AND?查询语言的运算符 OR 的优先级是否应该高于 AND 的优先级?
【发布时间】:2009-10-23 18:11:41
【问题描述】:

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

在处理足够大的数据时,这种优先级划分很不方便,因为如果不使用括号就无法创建可重用的查询上下文。使用 AND 创建上下文更方便,然后使用 OR 在该上下文中合并结果。用空格作为AND运算符,逗号作为OR运算符就更方便了。

示例: 在互联网上搜索 11 月或 12 月飞往巴哈马的机票时,输入“机票巴哈马 11 月、12 月”而不是“机票巴哈马 11 月”、“机票巴哈马 12 月”或“机票巴哈马 (11 月,十二月)”

在 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}

当然,这个想法可以发展成有 2 个运算符 OR 一个比 AND 的优先级高,一个比 AND 低,例如 ',' 更高,';'较低,但在许多情况下,语言没有多余的符号来扩展这种方式,而且使用它的“,”的现有优先级也很低。

【问题讨论】:

  • 请注意,gmail 过滤器已经在使用这种反向优先级 - 优先级为 |高于空格 (AND)。
  • 请注意,当您在 MS Access 中设计查询条件时,可以将 A 或 B 放在一列中,将 C 放在另一列中,MS Access 将使用(A 或 B)和 C 构建查询。

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


【解决方案1】:

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

【讨论】:

  • 但是用 || 替换逻辑 OR 符号(看起来像 V)已经违反了数学符号。和逻辑 AND 符号(看起来像 A)与 && 只是因为键盘没有这些符号。如果这种违规行为不是世界末日,那么为什么不通过改变优先级来进一步违反它呢?
  • 符号的改变和逻辑的改变有很大的不同。
【解决方案2】:

我宁愿在代码、SQL、搜索查询等所有地方都保持一致,这样我就不必记住在这种特殊情况下它的走向。

【讨论】:

  • 我同意一致性比许多其他甚至好的改进具有更高的优先级。这就是为什么当他们发明新的语言或技术时,任何错误都会成为永久性的。顺便说一句,在使用 SQL 编程时,您是否注意到,当您使用 OR 时,您几乎总是必须放括号,而使用 AND 时则不需要?
【解决方案3】:

我认为您忽略了运算符的优先级。它们只是为了方便程序员/书籍作者而存在。操作顺序的使用使得某些子句可以不用括号来编写,但是使用括号可以确保读者确切地知道代码在做什么,尤其是当不同的语言有不同的操作顺序时。

【解决方案4】:

我不知道有什么语言可以做到这一点,但是将 AND 和 OR 组合在一起而不使用括号可能是错误的。这是导致愚蠢错误的常见原因。

【讨论】:

  • 可能是那些愚蠢的错误是错误优先级的结果。
  • 我知道两个:MS Access 和 gmail 过滤器。在主要问题下方查看我的 2 cmets。
【解决方案5】:

当布尔运算符用于连接逻辑语句时,“and”运算符应优先于“or”。我认为混淆的地方在于,许多查询语言隐含地从名词形成逻辑语句,但并不清楚这些语句是什么。

例如,“foo & bar”可能会被解释为只接受同时满足以下两个条件的页面:

  1. 该页面包含与“foo”匹配的项目。
  2. 该页面包含与“bar”匹配的项目。

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

  1. 此页面包含与“foo”或“bar”匹配的项目。

请注意,在简单的“foo | bar”情况下,选择哪种解释并不重要,但如果没有“foo & moo | bar”,则不可能对| 运算符采用后一种解释将其优先于 & 运算符,除非将 foo & moo 解释为含义:

  1. 此页面包含与“foo”或“moo”匹配的项目。

如果& 的参数包含通配符,这样的解释可能是有意义的(例如foo* & *oot 可能意味着单个项目必须以“foo”开头并以“oot”结尾,而不是意味着该页面具有有一个以“foo”开头的项目和一个以“oot”结尾的可能不同的项目),但没有这样的通配符,任何页面都不能包含同时匹配“foo”和“moo”的项目,因此没有页面可以包含这样的项目。

也许解决方案是让单独的操作员加入项目而不是加入页面。例如,如果&&&&!|| 加入页面,而&&!| 加入要匹配的内容,则foo && bar || moo && jar || quack && foo* | m* & *l &! *ll 将匹配包含“ foo" 和 "bar",每个包含 "moo" 和 "jar" 的页面以及包含单词 "quack" 并且还包含以 "foo" 或以 "m" 开头的单词的每个页面, 以“l”结尾,不以“ll”结尾。

【讨论】:

  • 您混合了 2 种查询语言 - 一种匹配页面集,另一种匹配文本内的标记集。我的想法只是关于页面集和 SQL,在这种情况下,“foo & moo | bar”的解释没有歧义。令牌查询语言可能需要不同的优先级和优先级,因为它处理少量的文本模式,Regex 可以正常工作。我喜欢您将两种不同语言的布尔运算符混合在一起时使用不同符号的想法。
【解决方案6】:

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

airline tickets bahama november

肯定是这样理解的,例如

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

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

关键是,如果优先级相同,则始终可以提出更长的查询,而使用替代优先级时,查询会更短。就像如果加法比乘法具有更高的优先级,那么就有可能提出可以用更少的括号编写的算术表达式。但这本身并不是改变行为的充分理由。

【讨论】:

  • 你忘了 OR 12 月。没有它,只有 AND,优先级无关紧要。你的回答很愚蠢。
猜你喜欢
  • 2016-04-04
  • 2019-01-17
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多