我感觉这是一个相对简单的问题,但半个小时后,我仍然不知道如何解决它。
在 PostgreSQL 查询WHERE
子句中,我需要引用一个值而不是直接使用它。该查询将在 Ruby 脚本中执行,我无法直接从我的环境中插入需要获取的值。
我的查询是
CREATE MATERIALIZED VIEW my_mat_view AS
SELECT ...
...
WHERE occurred_at BETWEEN NOW() - INTERVAL '?? HOURS' AND NOW()
用于计算间隔的小时数在INTERVAL_HOURS
环境变量中定义。如上所述,我可以??
用插值替换,因为它在单引号内。
我的想法是使用变量(或产生相同结果的东西)将插值移到单引号之外。
我发现最接近解决方案的选项是
DO $$
DECLARE myVar INT;
BEGIN
myVar := #{ENV['INTERVAL_HOURS'};
CREATE MATERIALIZED VIEW my_mat_view AS
SELECT ...
...
WHERE occurred_at BETWEEN NOW() - INTERVAL 'myVar HOURS' AND NOW()
END $$;
应该可以正确插值,但会产生
Query 1 ERROR at Line 1: : ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function inline_code_block line 5 at SQL statement
我尝试SELECT
用替换PERFORM
,但视图未创建(并且未返回任何错误)。
我这里漏掉了什么?我可以采取其他方法吗(例如,WITH
子句)?