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

SQL查询IN条件如何无需预定义占位符传入任意数量参数

问题描述

通常我们会使用如下形式的SQL查询,通过预定义的编号占位符$1传入参数:

queryRunner.query('SELECT * FROM sample_data WHERE code IN ($1)', ['1'])

现在希望无需提前定义占位符的数量,即可为IN条件传入任意数量的参数,例如实现如下调用效果,请问有什么解决方案?

queryRunner.query('SELECT * FROM sample_data WHERE code IN ($$)', ['1','2','3'])
解决方案

方案1:手动动态生成占位符(全场景通用)

这是兼容性最高的方案,不需要依赖任何框架或者数据库客户端的特殊支持,核心逻辑是根据待传入IN的参数长度,动态生成对应数量的编号占位符,再拼接到SQL语句中,全程参数走预编译传参通道,不会引入SQL注入风险。
示例代码(JavaScript环境):

// 1. 定义IN条件需要的参数数组
const codeList = ['1', '2', '3'];
// 2. 空参数特殊判断,避免生成IN()的语法错误
if (codeList.length === 0) {
  // 可根据业务需求处理,比如直接返回空结果,或者调整SQL逻辑
  return [];
}
// 3. 按参数长度生成对应占位符:长度为3时生成"$1,$2,$3"
const placeholders = codeList.map((_, idx) => `$${idx + 1}`).join(',');
// 4. 拼接最终SQL
const sql = `SELECT * FROM sample_data WHERE code IN (${placeholders})`;
// 5. 执行查询,参数直接传原数组即可
const result = await queryRunner.query(sql, codeList);

方案2:使用数据库客户端/ORM的内置支持

大部分主流的数据库客户端和ORM框架都已经内置了IN条件的数组参数处理能力,不需要手动拼接占位符:

  • 如果你用的是PostgreSQL的pg-promise客户端,可以直接使用:list修饰符:
    queryRunner.query('SELECT * FROM sample_data WHERE code IN ($1:list)', [['1','2','3']])
    
  • 如果你用的是TypeORM、Sequelize、MyBatis等ORM框架,直接将数组作为参数传入IN条件对应的占位符即可,框架会自动生成对应数量的占位符。
注意事项
  • 绝对不要直接将参数值拼接进SQL字符串,比如写WHERE code IN (${codeList.join(',')}),这种写法会存在严重的SQL注入风险。
  • 一定要处理IN参数为空数组的场景,SQL语法不支持空的IN括号,直接生成会抛出语法错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:54:03