首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL + goLang --运行带有IN条件的select语句--并传递给它一个ids数组?

SQL + goLang --运行带有IN条件的select语句--并传递给它一个ids数组?
EN

Stack Overflow用户
提问于 2018-06-02 04:53:09
回答 1查看 475关注 0票数 0

我想执行以下逻辑-

代码语言:javascript
复制
SELECT some_column
FROM table_name
WHERE id IN (value1, value2, ...);

在我的go代码中,我有以下int数组来表示我的in:

代码语言:javascript
复制
idsToGet := []int{1,2}

我完全理解您通常会执行一个sprintf并传入您要查找的一个id……但是..。

我觉得有一种明智的方法可以做到这一点,而不是迭代数组,并对每个ID进行单独的调用。通过sprintf -有没有一种方法可以让我的IN子句自动包含数组中的所有内容?

全新的Go -我花了一个小时来解决这个问题,我让它在单id下工作-但不能在多个id下工作。

EN

回答 1

Stack Overflow用户

发布于 2018-06-02 10:14:58

您不希望使用Sprintf将原始值放入SQL中,这是一个坏习惯。您要做的是使用适当数量的占位符构建一些SQL,然后让库负责用占位符的值替换占位符。

如果您的阵列中有两个int,则需要构建以下内容:

代码语言:javascript
复制
SELECT some_column
FROM table_name
WHERE id IN (?, ?)

如果你有四个,那么你想要构建:

代码语言:javascript
复制
SELECT some_column
FROM table_name
WHERE id IN (?, ?, ?, ?)

诸若此类。您所需要的只是一个可以生成n占位符的简单函数;有很多方法可以做到这一点:

代码语言:javascript
复制
func placeholders(n int) string {
    ps := make([]string, n)
    for i := 0; i < n; i++ {
        ps[i] = "?"
    }
    return strings.Join(ps, ",")
}

或者:

代码语言:javascript
复制
func placeholders(n int) string {
    var b strings.Builder
    for i := 0; i < n - 1; i++ {
        b.WriteString("?,")
    }
    if n > 0 {
        b.WriteString("?")
    }
    return b.String()
}

或者任何对你来说最清楚的东西,只要它是正确的,实现就不太可能有任何可衡量的影响。

然后你可以这样说:

代码语言:javascript
复制
query := fmt.Sprintf("select some_column from table_name where id in (%s)", placeholders(len(idsToGet)))
rows, err := db.Query(query, idsToGet...)

并以通常的方式旋转抛出rows

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

https://stackoverflow.com/questions/50650875

复制
相关文章

相似问题

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