在PostgreSQL中引用子查询列

时间:2014-02-12 18:14:46

标签: postgresql

我对MySQL语法非常熟悉,但我似乎遇到了进入PostgreSQL环境的一些成长的烦恼。在MySQL中,您可以轻松引用连接子查询中的列,但我在PostgreSQL中抛出错误。

例如:

SELECT
  a.userID,
  b.firstname,
  c.minCounter
FROM users a
JOIN users_info b ON (a.userID = b.userID)
LEFT JOIN (
   SELECT
      user_id,
      COUNT(*) AS 'minCounter'
   FROM sales
   WHERE
      total_amount > 500
   GROUP BY user_id
) as c ON (b.userID = c.user_id)

引用子查询“c”及其临时列“minCounter”没有问题。但是在PostgreSQL中,类似的查询会返回错误:

ERROR:  syntax error at or near "'minCounter'"
LINE 10:   COUNT(*) AS 'minCounter'

计算文字列与命名列

如果我将第10行切换到状态:COUNT(*)AS“minCounter”

我的错误只是调整为:

ERROR:  column c.mincounter does not exist
LINE 4: c.minCounter

关于我缺少什么语法或一般命名差异的任何建议?

(注意,我不确定我们正在运行什么版本的PostgreSQL,因为它被我们的外部开发团队混淆了。)

谢谢!

1 个答案:

答案 0 :(得分:2)

这与引用列无关,而是为列提供别名。

'minCounter'不是列别名,而是字符文字。如果要引用标识符,则必须使用双引号:"minCounter"

有关详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

这符合SQL标准的规定和要求(MySQL选择忽略它,并且没有真正区分使用单引号的字符文字和使用双引号的对象标识符)。

使用双引号引用标识符后,它将区分大小写。所以在你的外部查询中你还需要"minCounter",因为minCounter是一个不同的名字(这又是根据SQL标准 - 你猜对了 - 也被MySQL忽略了)

总结一下:

  • 没有引号:不区分大小写的标识符(或关键字,或运算符,...)
  • 双引号:案例敏感标识符
  • 单引号:常量字符值(又名“字符文字”)

一般情况下,我强烈建议永远引用任何标识符