我凭经验发现 PostgreSQL 允许您创建“元组”(我的术语,我不知道他们怎么调用它)以在 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 绑定(bind)到以下查询中的某些内容,例如 $1 是 0 对或多对 a_id
和 b_id
的列表?
client.query("UPDATE t SET x=true WHERE (a_id, b_id) IN $1"), [...?])
如果没有,我至少可以做
client.query("UPDATE t SET x=true WHERE (a_id, b_id) IN ($1, $2, ...$N)", [ a1b1, a1b2, ...aNbN ])
?
最佳答案
下面是一种将带有一个参数的整数数组传递给未命名的准备语句的方法,但我确定这有多大用处,但肯定可以用 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)
关于第二种方式 - 它完全按照您在示例中显示的方式完成
更新
由于我的阅读不准确,我再次回答了不同的问题。但我决定离开上面,所以下一段代码会更容易理解:
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)
关于sql - 如何通过客户端库 (Postgres) 在 SQL 查询中将元组(不是数组)作为 WHERE 约束参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46922371/