简体   繁体   English

将数组插入到 Javascript Postgres 查询中

[英]Interpolating an array into a Javascript Postgres query

So I'm working in Node.js and using the 'pg' npm module.所以我在 Node.js 中工作并使用 'pg' npm 模块。 I'm trying to check to see if the contents of an array are contained within an array that's stored in a Postgres table (the order doesn't matter to me--it should return true if there is a 1:1 element ration between arrays).我正在尝试检查数组的内容是否包含在存储在 Postgres 表中的数组中(顺序对我来说无关紧要 - 如果之间存在 1:1 的元素比率,它应该返回 true数组)。

The Postgres query looks like this: Postgres 查询如下所示:

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

In my javascript, I'm calling it like this:在我的 javascript 中,我这样称呼它:

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

numberMembers is an array that was originally pulled from Postgres, and then mapped to a number array: numberMembers 是一个数组,最初是从 Postgres 中拉出来的,然后映射到一个数字数组:

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

For some reason, I'm not getting anything back from 'results'.出于某种原因,我没有从“结果”中得到任何回报。 As an example, in the case where numberArray would be an array with elements 1, 2, and 3, look below.例如,如果 numberArray 是一个包含元素 1、2 和 3 的数组,请看下面。

To get it to work I need to query directly into my database:为了让它工作,我需要直接查询我的数据库:

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

I believe you need to execute the query like so:我相信您需要像这样执行查询:

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

But the proper solution would be to "generate" and execute the query as follows:但正确的解决方案是“生成”并执行查询,如下所示:

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