如何通过客户端库(Postgres)在SQL查询中传递元组(不是数组)作为WHERE约束参数?

我已经经验地发现,PostgreSQL可以让你创build'元组'(术语,我不知道他们叫什么)在WHERE中定义一个多列条件:

update T set x=true where (a_id, b_id) IN ((3428, 3544), (3450, 3542)); 

这似乎正是我所希望的: x更新在哪里a_id =元组中的第一项AND b_id =元组中的第二项。 这接近于有用,但为了真正重要,我必须能够将这些“元组”设置为来自客户端库的参数; 特别是在这种情况下的node-pg

是否有可能将$ 1绑定到以下查询中的某些内容,例如$ 1是0个或更多对a_idb_id

 client.query("UPDATE t SET x=true WHERE (a_id, b_id) IN $1"), [...?]) 

如果没有,我至less可以这样做

 client.query("UPDATE t SET x=true WHERE (a_id, b_id) IN ($1, $2, ...$N)", [ a1b1, a1b2, ...aNbN ]) 

下面是一个将一个参数数组传递给未命名的准备语句的方法,但是我确定这有多less可用,但是肯定可以用node-postgres来实现。

SQL:

 f=# create table nu(i int, t text); CREATE TABLE f=# insert into nu values (1,'a'),(2,'a'),(4,'a'); INSERT 0 3 f=# select * from nu; i | t ---+--- 1 | a 2 | a 4 | a (3 rows) 

JS:

 client.query("update nu set t = 'b' where i = any ($1::int[]) returning *", [[1,2,3]], (err, res) => { console.log(err, res.rows) client.end() }) 

输出:

 null [ anonymous { i: 1, t: 'b' }, anonymous { i: 2, t: 'b' } ] 

额外支票:

 f=# select * from nu; i | t ---+--- 4 | a 1 | b 2 | b (3 rows) 

关于第二种方式 – 完全按照您在示例中显示的方式完成

UPDATE

由于我的读数不准确,我再次回答了不同的问题。 但我决定离开上面,所以下一个代码将更容易理解:

 client.query("update nu set t = 'foo' where (i,t)::text = any ($1::text[]) returning *", ['{"(1,b)","(2,b)"}'], (err, res) => { console.log(err, res.row) client.end() }) 

并由此产生的声明:

 t 2017-10-26 07:53:25 UTC :: LOG: execute <unnamed>: update nu set t = 'foo' where (i,t)::text = any ($1::text[]) returning * t 2017-10-26 07:53:25 UTC :: DETAIL: parameters: $1 = '{"(1,b)","(2,b)"}' 

结果是:

 f=# select * from nu; i | t ---+----- 4 | a 1 | foo 2 | foo (3 rows)