当我使用MySQL时,以下查询运行干净。
SELECT 1 as num1, (select(num1 + 1)) as num2
但PostgreSQL返回错误。
ERROR: column "num1" does not exist
为什么它的反应不同?
答案 0 :(得分:4)
问题不应该是为什么Postgres不支持这种语法,而是为什么MySQL会这样做。在大多数RDBMS中,别名仅在执行查询后才会解析,因此您无法在声明它们的查询中使用它们。例如,更常见的用例 - 您不能在声明它的query / table-element的where
子句中使用列别名。
一种方法是使用子查询:
SELECT num1, num1 + 1 AS num2
FROM (SELECT 1 AS num1) t
答案 1 :(得分:3)
你应该使用PostgreSQL语法,因为PgSql不支持这种方式的子查询,试试这个
WITH tblcontent AS (SELECT 1 as num1)
SELECT num1, num1 + 1 AS num2 from tblcontent
答案 2 :(得分:2)
我找不到任何好的来源,但我确信该标准不要求在相关子查询中可见的投影列别名。我刚刚在SQL Server和Oracle中尝试过它,它们似乎都同意PostgreSQL,拒绝在相关的子查询中使用x
,无论它位于外部选择的哪个子句中。
类似于MySQL允许以下查询的方式:
SELECT a + 1 x
FROM t
ORDER BY x + 1
但SQL Server和Postgres没有。对于在各种子句中使用别名而不是标准要求,MySQL似乎更宽容。