如何通过客户端库(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_id
和b_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)