是否可以在 postgres 中将 WITH 子句别名作为函数参数传递?

Is it possible to pass a WITH clause alias as function argument in postgres?

我想重构我的查询以使用子查询作为函数参数。

原始查询看起来像这样并且工作正常:

SELECT date_trunc('hour', (SELECT timestamp FROM data ORDER BY timestamp DESC LIMIT 1));

我想知道是否可以重构查询以传递别名值作为参数而不是上面显示的 SELECT 语句。

我试过想出这样的东西,但运气不好:

WITH ts_query AS (
  SELECT "timestamp" FROM "data" ORDER BY "timestamp" DESC LIMIT 1
) 
SELECT date_trunc('hour', ts_query);

当我收到以下错误时:

ERROR: column "ts_query" does not exist

这是你想要的吗?

WITH ts_query AS (
      SELECT "timestamp"
      FROM "data"
      ORDER BY "timestamp" DESC
      LIMIT 1
     )
SELECT date_trunc('hour', "timestamp")
FROM ts_query;

换句话说,ts_query 替换了 table 而不是后续查询中的

在更复杂的查询中,可以使用:

SELECT date_trunc('hour', t1."timestamp")
FROM ts_query tq CROSS JOIN
     . . .   -- more query logic here

我在要参数化的查询中执行此操作,有一个 CTE(称为 params),其中包含在查询的其余部分中使用的参数。

如果您知道 CTE 只有一行,您可以将它用作标量子查询:

SELECT date_trunc('hour', (SELECT "timestamp" FROM ts_query) )

如果 CTE 有不止一行,那么这将产生 运行 次错误。