[英]Interpolating an array into a Javascript Postgres query
所以我在 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}')
我相信您需要像这样执行查询:
let getComFromMembers = `SELECT * FROM ComTable WHERE members @> $1 AND members <@ $1`;
let numberMembers = [101, 212, 333];
let results = await client.query(getComFromMembers, ["{" + numberMembers.join(",") + "}"]);
但正确的解决方案是“生成”并执行查询,如下所示:
let numberMembers = [101, 212, 333];
let placeHolder = numberMembers.map((_, i) => `$${i+1}`).join(", ");
// the result would be "$1, $2, $3"
let getComFromMembers = `SELECT * FROM ComTable WHERE members @> ARRAY[${placeHolder}]::integer[] AND members <@ ARRAY[${placeHolder}]::integer[]`;
// the result would be "SELECT * FROM ComTable WHERE members @> ARRAY[$1, $2, $3]::integer[] AND members <@ ARRAY[$1, $2, $3]::integer[]"
getComFromMembers;
let results = await client.query(getComFromMembers, numberMembers);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.