如何在 CTE 或子查询中引用 DISTINCT 列名?

How to reference DISTINCT column names in a CTE or subquery?

我需要从 table 生成唯一列对列表,但 Postgres 似乎不喜欢我的方法。

我的 CTE 方法:

WITH cte AS (
  SELECT DISTINCT(col1, col2)
  FROM table1
  WHERE col1 IS NOT NULL
  AND col2 IS NOT NULL
)
SELECT json_build_object('col1', cte.col1, 'col2', cte.col2)
FROM cte;

给我这个错误:

ERROR: column cte.col1 does not exist
LINE 8: SELECT json_build_object('col1', cte.col1, 'col2...

我也尝试了子查询:

SELECT json_build_object('col1', col1, 'col2', col2)
FROM (
  SELECT DISTINCT(col1, col2)
  FROM table1
  WHERE col1 IS NOT NULL
  AND col2 IS NOT NULL
) AS temp;

失败的方式基本相同:

ERROR: column "col1" does not exist
LINE 1: SELECT json_build_object('col1', col1, 'col2...

由于 DISTINCT,我似乎无法正常引用列名。我应该怎么做?

您错误地使用了括号。 DISTINCT 不是 函数。

括号被解释为 row constructor,因此您的 CTE returns 只有一个 record 类型的值(并且名称由数据库选择)。

去掉括号,一切都会好起来的。

撇开放错地方的括号不谈,因为无论如何都要在子查询中准备相关列,所以只需在外部 SELECT:

中使用更简单的 to_json()
SELECT to_json(temp)
FROM  (
   SELECT DISTINCT col1, col2
   FROM   table1
   WHERE  col1 IS NOT NULL
   AND    col2 IS NOT NULL
   ) temp;