我在 psql 中运行了一些查询,使用了一个时间间隔,其中一部分查询就像
where g2.datetime between g1.datetime+'19 minutes' and g1.datetime+'21 minutes'
即我想在 g1.datetime 之后间隔 20 分钟左右
如果我想多次执行此操作,既可以使其更容易又不易出错(我在查询中也多次提到 20 分钟)。我打算做类似的事情:
\set timelag 20
\set before :timelag-1
\set after :timelag+1
如果我做一个
select :timelag, :before, :after;
这似乎工作得很好,但令人讨厌的是,我只是连接字符串(所以查询实际上是“选择 20、20-1、20+1”),因为如果我确实尝试制作我需要的东西:
\set beforemin '\'' :before ' minutes\''
事实证明,我所拥有的是“20-1 分钟”——这与查询中的预期不符。
是否有可能使 psql 变量作为数字工作,或者是否超出了这些范围,所以我将不得不用其他语言或函数定义查询?
不确定这个问题,但是 psql 根本没有变量。它只是一种宏语言。
是的,通过使用 SQL 求值器
\gset
将结果复制到变量中。例子:
在 PostgreSQL 10 或更高版本中,变量也在反引号执行的字符串中扩展,因此我们也可以通过 shell 调用外部计算器:
或更现代的(使用 bash):
在极少数情况下,当这些表达式可能必须在失败事务的中间或与数据库断开连接时计算时,SQL 之外的调用可能很方便。