Language agnostic 查询语言的优先级应该是运算符还是高于AND?

Language agnostic 查询语言的优先级应该是运算符还是高于AND?,language-agnostic,programming-languages,search-engine,coding-style,Language Agnostic,Programming Languages,Search Engine,Coding Style,传统上,大多数编程语言的优先级都高于或,因此表达式“a或b和c”被视为“a或(b和c)”。根据这个想法,搜索引擎和查询/寻址语言(css、xpath、sql等)使用相同的优先级。是不是搞错了 在处理足够大的数据时,这种优先级划分很不方便,因为不使用括号就无法创建可重用的查询上下文。使用AND创建上下文更方便,然后使用OR在该上下文中合并结果。如果空格用作AND运算符,逗号用作OR运算符,则更方便 示例: 在互联网上搜索11月或12月飞往巴哈马的机票时,键入“机票巴哈马11月、12月”比键入“机票

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

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

示例: 在互联网上搜索11月或12月飞往巴哈马的机票时,键入“机票巴哈马11月、12月”比键入“机票巴哈马11月”、“机票巴哈马12月”或“机票巴哈马(11月、12月)”更方便

在CSS中,如果我们需要设置两个元素的红色样式,我们必须这样做: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的优先级高于,我们将在CSS:body.app1 div.d1 td.phone,td.fax span.area{color:red}中写入


当然,这个想法可以发展成有两个操作符,或者一个优先级高于AND,另一个优先级较低,例如“is higher;”较低,但在许多情况下,语言没有多余的符号来扩展,而且“使用位置”的现有优先级也较低。

我更希望在代码、SQL、搜索查询、,这样我就不必记住在这种特殊情况下它是怎么走的了。

考虑到OR和and的背景来自于数学逻辑,它们有明确的优先级,在您的设计中,如果不混淆绝大多数用户,您就不能违反该优先级。

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

我不知道有哪种语言能做到这一点,但是,如果使用和或组合使用括号,则可能是错误的。这是导致愚蠢错误的常见原因。

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

例如,“foo&bar”可能被解释为仅接受以下两种情况均为真的页面:

  • 该页面包含与“foo”匹配的项
  • 页面包含与“栏”匹配的项
  • 查询“foo | bar”可能被解释为评估上述条件并接受任一条件为真的任何页面,但也可能被解释为涉及单个条件:

  • 此页面包含与“foo”或“bar”匹配的项
  • 请注意,在简单的“foo | bar”情况下,选择哪种解释并不重要,但如果给定“foo&moo | bar”,则不可能对
    运算符采用后一种解释,而不赋予其优先于
    &
    运算符,除非将
    foo&moo
    解释为以下含义:

  • 此页面包含与“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”结尾的页面。

    讽刺的是,在第一个示例中,隐式使用优先级较高的
    ,因为

    airline tickets bahama november
    
    比如说,肯定会被理解为

    .... WHERE transport = "AIR" AND target like "%bahamas%" AND month = "Nov"
    
    这很好地暴露了你想法的愚蠢


    关键是,如果先例与它们相同,那么总是可能产生更长的查询,而如果有其他先例,则可能产生更短的查询。就像如果加法的优先级高于乘法,那么就有可能用更少的括号写出算术表达式。但这本身并不是改变行为的充分理由。

    我同意一致性比许多其他甚至好的改进都更重要。这就是为什么当他们发明新的语言或技术时,任何错误都会变成永久性的。顺便问一下,在用SQL编程时,您是否注意到,当您使用或几乎总是要放括号时,而不是当您使用AND时?但是用| |和lo替换逻辑或符号(看起来像V)已经违反了数学符号