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

PostgreSQL中ANY查询绑定多参数报错,如何正确传参?

PostgreSQL ANY数组参数传递错误解决方法

问题场景

需要查询users表,将bigint类型的id转换为int后,通过ANY匹配多个int值。原SQL语句如下:

SELECT *
FROM users
WHERE id::int = ANY(?::int[])

执行时控制台生成的预编译语句为:

SELECT *
FROM users
WHERE id::int = ANY($1::int[])

但传入参数8988,9939,7106,6019,3284,8356,5751,8192,4726,4911,9429,1892,3026,7726,10142,182,3318,3612,10835时,触发错误:

error: bind message supplies 19 parameters, but prepared statement "" requires 1

在pgAdmin中直接运行SELECT * FROM sites WHERE id::int = ANY('{ 8988,9939 }')可正常执行,但不知道如何正确在代码中传递参数。

错误原因

SQL语句中的$1是一个数组类型参数,数据库期望接收1个包含19个元素的int数组,但实际传递了19个独立的数值参数,导致参数数量不匹配。

解决方法

方法1:直接传递数组参数(推荐)

根据使用的数据库驱动(如Node.js的pg模块),直接将数组作为单个参数传入,驱动会自动处理格式转换。

以Node.js的pg模块为例:

const targetIds = [8988,9939,7106,6019,3284,8356,5751,8192,4726,4911,9429,1892,3026,7726,10142,182,3318,3612,10835];
const queryResult = await client.query(`
  SELECT *
  FROM users
  WHERE id::int = ANY($1::int[])
`, [targetIds]); // 数组作为单个参数传入

方法2:手动拼接数组格式字符串(需注意SQL注入)

如果无法直接传递数组,可将数值拼接成PostgreSQL支持的数组格式字符串(带大括号),再作为单个参数传入:

const targetIds = [8988,9939,...];
const arrayStr = `{${targetIds.join(',')}}`;
const queryResult = await client.query(`
  SELECT *
  FROM users
  WHERE id::int = ANY($1::int[])
`, [arrayStr]);

⚠️ 注意:若参数来自用户输入,必须严格校验和转义,避免SQL注入风险。

关于IN的补充说明

最初尝试用IN时出错,原因和ANY一致——IN需要(val1, val2, ...)的参数列表,若要动态生成,需对应数量的占位符:

SELECT * FROM users WHERE id::int IN ($1, $2, $3, ...)

这种方式需要根据数组长度动态生成占位符,相比ANY()结合数组参数的写法更繁琐,推荐优先使用数组参数的ANY写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:55:15