Можно ли передать псевдоним предложения WITH в качестве аргумента функции в postgres? - PullRequest
1 голос
/ 17 января 2020

Я хотел бы реорганизовать свой запрос, чтобы использовать подзапрос в качестве аргумента функции.

Исходный запрос выглядит следующим образом и работает нормально:

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

1 Ответ

3 голосов
/ 17 января 2020

Это то, что вы хотите?

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 больше чем одна строка, то это приведет к ошибке во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...