You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PG-Promise传递数组作为参数仅返回一条结果的问题排查

如何正确向SELECT查询传递数组参数实现IN匹配

问题核心

你当前用字符串拼接join的方式虽然能实现需求,但存在严重的SQL注入风险,不建议继续使用。你尝试的:list/:csv修饰符无效,问题出在参数传递的方式错误。

正确的参数化实现(以pg-promise为例)

从你使用的:list/:csv语法判断,你应该在用pg-promise库。正确的做法是把数组作为单个参数传入查询方法的参数列表(外层包裹一个数组):

var values = ['WH12345678','WH22345678'];
// 使用:list修饰符自动处理数组格式
var query = "select * from pups where workorder IN ($1:list)";
// 关键:将values作为单个元素放入参数数组
db.any(query, [values])
  .then(data => {
    // 处理查询结果
  })
  .catch(err => {
    // 处理错误
  });

也可以用:csv修饰符,效果一致:

var query = "select * from pups where workorder IN ($1:csv)";
db.any(query, [values]);

之前写法失败的原因

你直接调用db.any(query, values)时,数组的每个元素会被当作独立的查询参数(对应$1、$2),但:list/:csv修饰符需要的是单个参数对应的完整数组,最终导致查询只匹配了数组的第一个元素。

为什么要放弃join拼接?

手动拼接字符串完全没有SQL注入防护,如果values中包含恶意内容(比如'); DROP TABLE pups;--),会直接执行破坏性操作。参数化查询会自动处理字符串转义,从根源避免这类风险。

内容的提问来源于stack exchange,提问作者FreeSoftwareServers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:15:02