首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript (Postgres )--如何在WHERE ()子句中使用以数组为参数的准备语句

JavaScript (Postgres )--如何在WHERE ()子句中使用以数组为参数的准备语句
EN

Stack Overflow用户
提问于 2018-11-13 11:44:23
回答 1查看 3.2K关注 0票数 5

目前,我正在使用http://vitaly-t.github.io/pg-promise/Database.html中的数据库类,并试图在Postgres上使用PreparedStatment实现一个更新语句,同时将一个数组传递给WHERE子句。

代码语言:javascript
复制
const updatePreparedStatment = new PS('prepared-statement', 'UPDATE mytable SET "MESSAGE"=$1 WHERE "ID" IN ($2)', ["dummy update", ["1","2","3"]]);
EN

回答 1

Stack Overflow用户

发布于 2018-11-14 08:40:31

它是用节点-postgres https://github.com/brianc/node-postgres/wiki/FAQ#11-how-do-i-build-a-where-foo-in--query-to-find-rows-matching-an-array-of-values的常见问题描述的。

如何构建WHERE foo IN (.)查询以查找与值数组匹配的行?节点-postgres支持将简单的JavaScript数组映射到PostgreSQL数组,因此在大多数情况下,您可以像传递任何其他参数一样传递它。

代码语言:javascript
复制
client.query("SELECT * FROM stooges WHERE name = ANY ($1)", [ ['larry', 'curly', 'moe'] ], ...);

请注意,= ANY是另一种写入IN (.)的方法,但与IN (.)不同当您将数组作为查询参数传递时,它将如何工作。

如果预先知道数组的长度,可以将其压缩为in列表:

代码语言:javascript
复制
// passing a flat array of values will work:
client.query("SELECT * FROM stooges WHERE name IN ($1, $2, $3)", ['larry', 'curly', 'moe'], ...);

..。但是,当=使用JavaScript数组时没有什么好处。

如果您使用的是节点-postgres的旧版本,或者需要创建节点-postgres没有处理的更复杂的PostgreSQL数组(组合类型数组,等等),则可以使用动态SQL生成数组文本,但在这样做时要非常小心。以下方法是安全的,因为它生成带有查询参数的查询字符串和扁平的参数列表,因此仍然使用驱动程序对参数化查询(“准备好的语句”)的支持来防止SQL注入:

代码语言:javascript
复制
var stooge_names = ['larry', 'curly', 'moe'];
var offset = 1;
var placeholders = stooge_names.map(function(name,i) { 
    return '$'+(i+offset); 
}).join(',');
client.query("SELECT * FROM stooges WHERE name IN ("+placeholders+")", stooge_names, ...);

希望这能帮上忙,因为谷歌找不到这个

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53280333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档