【问题标题】:Using functional notation in PostgreSQL queries instead of dot notation在 PostgreSQL 查询中使用函数式表示法而不是点表示法
【发布时间】:2014-08-20 04:32:48
【问题描述】:

假设我们有两个表:

  1. contacts 具有列的表:idname
  2. conversations 包含列的表:idcontact_id(FK 到 contacts.id

以下两个查询返回相同的数据:

  • 点符号: SELECT contacts.name, contacts.id, conversations.id FROM contacts INNER JOIN conversations ON contacts.id = conversations.contact_id;

  • 功能符号: SELECT contacts.name, contacts.id, conversations.id FROM contacts INNER JOIN conversations ON id(contacts) = contact_id(conversations);

出于纯粹的理论原因,我想了解更多关于第二个(更实用的)版本的信息。这种语法叫什么,我在哪里可以了解更多信息?这是 SQL 标准中的语法还是只是 PostgreSQL?它是高性能的吗?为什么没有得到更广泛的使用?

【问题讨论】:

  • 感谢@dude 的评论,但我在这些文档中看不到关于第二种方法<column_name>(<table_name>) 的任何内容。您能更具体地说明在哪里看吗?
  • 这不是 SQL 标准,这是一个奇怪的 PostgreSQL 历史怪癖,应该避免。有点惊讶还没有人在上面添加弃用警告。
  • @ErwinBrandstetter ANSI/SQL 对此有不同的语法,虽然它看起来很有吸引力——它不应该被使用——它对于任何读者来说都是陷阱,相对于更常见的解决方案而言,它的性能优势为零。
  • 我在第一个 Pre Community Postgres - PostgreSQL95 - 命名为投影方法中找到了这段代码 - 所以 20 年前(1994 年)这段代码就在那里。我无法访问旧源。

标签: sql postgresql join


【解决方案1】:

它被称为“功能表示法”——与标准的“属性表示法”相对。

它是对 SQL 标准的扩展,性能相同。

名称的解析方式存在细微差别。比如:列名优先于采用点表示法(属性表示法)的复合类型的函数。

属性表示法(点表示法)仅适用于采用 single 参数的函数。所以这是一个有限的选择,规范的方法是对函数使用函数表示法(因此得名)。

另一方面,属性表示法更短(一个点对两个括号)、更便携(符合标准)并且通常是表限定列的规范方法。

您可以找到详细信息in the manual here

这个相关的答案有更详细的解释:

【讨论】:

    【解决方案2】:

    函数式表示法已经过时了——它是 NON SQL 时代的产物。

    不要在生产项目中使用它。它对性能没有影响 - 在解析器和分析器级别上解决了差异,但对于 SQL 标准没有任何意义。

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多