【问题标题】:Interpolating an array into a Javascript Postgres query将数组插入到 Javascript Postgres 查询中
【发布时间】:2022-06-13 22:27:39
【问题描述】:

所以我正在使用 Node.js 并使用 'pg' npm 模块。我正在尝试检查数组的内容是否包含在存储在 Postgres 表中的数组中(顺序对我来说无关紧要 - 如果之间存在 1:1 的元素比率,它应该返回 true数组)。

Postgres 查询如下所示:

let getComFromMembers = `SELECT * FROM ComTable WHERE (members @> ($1) AND members <@ ($1))`

在我的 javascript 中,我这样称呼它:

let results = await client.query(getComFromMembers, [numberMembers]);

numberMembers 是一个数组,最初是从 Postgres 中拉出来的,然后映射到一个数字数组:

let postgresArray = []
// query tables and populate postgresArray with .push()
let numberArray = postgresArray.map(Number)

出于某种原因,我没有从“结果”中得到任何回报。例如,如果 numberArray 是一个包含元素 1、2 和 3 的数组,请看下面。

要让它工作,我需要直接查询我的数据库:

SELECT * FROM ComTable WHERE (members @> '{1,2,3}' AND members <@ '{1,2,3}')

【问题讨论】:

  • @GrafiCode 我尝试使用 ANY($1::int[]) 和 ANY ($1) 但都不能正常工作。第一次抛出“运算符不存在:整数 [] @> 整数”,第二次抛出“找不到数据类型整数 [] 的数组类型”
  • 我明白了,但是这个特定的答案(已接受的答案)告诉您生成一个list,其中每个数字前面都有美元符号$(无论这意味着什么XD)stackoverflow.com/a/11691651/5334486 «你得到了 postgres 参数化转义»
  • 对该答案有评论(有 43 票赞成的那个),我认为这是正确的做法
  • @GrafiCode 我的意思是我尝试了 ANY ($1),我是否必须在我传入的 numberArray 周围添加另一组括号,然后再执行 ANY ($1) ?这太奇怪了

标签: javascript sql node.js postgresql pg


【解决方案1】:

我相信您需要像这样执行查询:

let getComFromMembers = `SELECT * FROM ComTable WHERE members @> $1 AND members <@ $1`;
let numberMembers = [1, 2, 3];
let results = await client.query(getComFromMembers, ['{' + numberMembers.join(",") + '}']);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2012-07-16
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多