【问题标题】:Is it possible to pass a WITH clause alias as function argument in postgres?是否可以在 postgres 中将 WITH 子句别名作为函数参数传递?
【发布时间】:2020-01-17 12:39:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql postgresql common-table-expression


    【解决方案1】:

    这是你想要的吗?

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

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

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

    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 有多于一行,则会产生运行时错误。

    【讨论】:

    • 哦,是的,它完美地涵盖了我的场景,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2014-03-07
    • 2011-04-11
    • 1970-01-01
    • 2014-04-15
    • 2020-02-19
    相关资源
    最近更新 更多