繁体   English   中英

将数组插入到 Javascript Postgres 查询中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM