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

标签 sql node.js postgresql node-postgres

我凭经验发现 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_idb_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/

相关文章:

javascript - JavaScript 中的 `>>>` 运算符是什么?

java - 我们可以将 .sql 文件导入 HSQL 数据库吗?

mysql - 考虑参数子集的选择

javascript - 如何将路径数组转换为树对象?

node.js - 我们可以通过 sequelize 使用迁移文件生成模型吗?

postgresql - 按列为订单添加索引有什么好处?

ruby-on-rails - Rails 帮助 ActionView::Template::Error 提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换

sql - Postgresql to_number() 函数格式

mysql - 什么样的 SQL 查询使用 rails 在控制台中检索数据

mysql - int(11) 和 int(6) 会导致索引问题吗?