【问题标题】:How to pass a parameterized INTERVAL in a slonik/postgres query?如何在 slonik/postgres 查询中传递参数化的 INTERVAL?
【发布时间】:2021-07-23 03:59:11
【问题描述】:

当我在 Datagrip 中使用参数值'14 days' 运行该查询时,它似乎是合法的 SELECT * FROM users WHERE users.updated_at < (CURRENT_DATE - INTERVAL $1)

但尝试在 slonik 中做类似的事情如下:

const interval='14 days'
// ...
const {rows} = await pool.query<any>(sql`
SELECT * FROM users WHERE users.updated_at < (CURRENT_DATE - INTERVAL ${interval}))
`)

似乎产生了相同的查询:"SELECT * FROM users WHERE updated_at &lt; CURRENT_TIME - INTERVAL $1)",但是当我尝试执行池的 query 方法时会抛出 syntax error near "$1" 错误。

我尝试了几种变体,包括转义输入 const interval="'14 days'" 并为 INTERVAL 函数 (CURRENT_DATE - INTERVAL(${interval})) 添加括号,但错误结果相同。

不能以这种方式参数化 slonik 查询还是我在做一些愚蠢的事情?

【问题讨论】:

    标签: postgresql node-postgres slonik


    【解决方案1】:

    您可以从CURRENT_DATE 中减去一个表示天数的整数,因为这是一个date 值而不是timestamp

    SELECT * FROM users WHERE updated_at < CURRENT_DATE - $1
    

    然后将$1作为整数传递

    另一种选择是将特定长度的interval 与参数相乘:

    SELECT * FROM users WHERE updated_at < CURRENT_DATE - (interval '1 day' * $1)
    

    或使用make_interval()函数:

    SELECT * FROM users WHERE updated_at < CURRENT_DATE - make_interval(days => $1)
    

    【讨论】:

    • 我已经知道大多数这些替代方案,我真正想做的是参数化整个表达式,就像我似乎能够在不涉及 slonik 时做的那样。这不可能?
    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多