SQL + goLang - 如何运行带有IN条件的select语句并传递一个id数组?

3
我希望实现以下逻辑 -
SELECT some_column
FROM table_name
WHERE id IN (value1, value2, ...);

在我的Go代码中,我有以下整数数组来表示我的ID:

idsToGet := []int{1,2}

我完全理解你可能会使用sprintf并传入你要查找的一个id... 但是...
我觉得有一种合理的方法可以在不迭代数组的情况下完成这个任务,并将其作为每个ID的单独调用...通过sprintf - 是否有一种方法可以只调用一次并让我的IN子句自动包含我的数组中的所有内容?
对Go完全陌生-尝试解决了一个小时,我已经为单个ID解决了这个问题,但对于多个ID则无法解决。
1个回答

2
你不想使用 Sprintf 将原始值放入 SQL 中,这是一个不好的习惯。你需要做的是构建一些带有正确数量占位符的 SQL,并让库来替换占位符与其值。
如果你的数组中有两个 int,那么你需要构建这个:
SELECT some_column
FROM table_name
WHERE id IN (?, ?)

如果您有四个,那么您希望构建的是:
SELECT some_column
FROM table_name
WHERE id IN (?, ?, ?, ?)

等等。您所需要的只是一个能够生成n个占位符的简单函数;有很多方法可以实现这一点:

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

或者也许:

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()
}

无论你使用何种方式,只要实现正确,它对于可度量的影响是微乎其微的。
然后你可以说这样的话:
query := fmt.Sprintf("select some_column from table_name where id in (%s)", placeholders(len(idsToGet)))
rows, err := db.Query(query, idsToGet...)

并以通常方式旋转抛出


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接