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

Golang中如何使用int64数组作为数据库查询条件过滤记录

方案1:使用参数化查询(最推荐,避免SQL注入)

不同语言/ORM的写法略有不同,核心思路是把数组元素展开为多个查询参数,以下是几个常用场景的示例:

  • Go 语言(标准库database/sql)
import "strings"

// 第一步:生成对应数量的占位符
placeholders := strings.Repeat("?,", len(ids))
placeholders = strings.TrimSuffix(placeholders, ",")
// 拼接SQL模板
sqlStr := fmt.Sprintf("SELECT * FROM `table` WHERE id NOT IN (%s)", placeholders)
// 第二步:把数组元素转为interface切片传参
args := make([]interface{}, len(ids))
for i, v := range ids {
    args[i] = v
}
// 执行查询
rows, err := db.Query(sqlStr, args...)
  • Python(pymysql/psycopg2)
# 生成占位符,不同数据库占位符可能是%s或?
placeholders = ', '.join(['%s'] * len(ids))
sql = f"SELECT * FROM `table` WHERE id NOT IN ({placeholders})"
# 执行时传入ids数组作为参数
cursor.execute(sql, ids)
  • Java(JDBC)
StringBuilder placeholders = new StringBuilder();
for (int i = 0; i < ids.size(); i++) {
    placeholders.append("?");
    if (i != ids.size() -1) {
        placeholders.append(",");
    }
}
String sql = "SELECT * FROM `table` WHERE id NOT IN (" + placeholders + ")";
PreparedStatement ps = connection.prepareStatement(sql);
for (int i = 0; i < ids.size(); i++) {
    ps.setLong(i+1, ids.get(i));
}
ResultSet rs = ps.executeQuery();

方案2:可控场景下的字符串拼接(仅做参考)

如果确定ids数组的内容完全可控(比如是系统内部生成的固定值,没有任何用户输入参与),可以直接把数组转成逗号分隔的字符串拼接:

// 示例仅适用于完全可控的输入,否则会有SQL注入风险
var idStrs []string
for _, v := range ids {
    idStrs = append(idStrs, strconv.FormatInt(v, 10))
}
inStr := strings.Join(idStrs, ",")
sqlStr := fmt.Sprintf("SELECT * FROM `table` WHERE id NOT IN (%s)", inStr)

额外说明

  • 支持数组类型参数的数据库(比如PostgreSQL)可以用更简单的语法,不需要展开参数:SELECT * FROM table WHERE id != ALL($1),直接传入int64数组作为$1的参数即可
  • 不要手动给int类型的查询值加引号,会导致索引失效甚至查询逻辑错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:57:03