我正在使用Go-pg,并且当我使用以下方式执行sql查询时:
db.Query(&result, sqlQuery, params)
其中params
是如下结构:
type MyParams struct {
Codes []int
}
并且sqlQuery
是
SELECT id FROM bar WHERE code_id IN (?codes)
在实际的SQL查询中,我得到这样的查询:
SELECT id FROM bar WHERE code_id IN ('[7,45]')
是否可以正确传递int数组占位符以进行查询:
SELECT id FROM bar WHERE code_id IN (7,45)
答案 0 :(得分:2)
您可以做几件事:
in (...)
并使用pg.In
。= any(array)
,而不是Go中的in (list)
和pg.Array
,以将适当的数组发送到PostgreSQL。第一个看起来像:
db.Query(&result, `SELECT id FROM bar WHERE code_id IN (?)`, pg.In(params.Codes))
第二个看起来像:
db.Query(&result, `SELECT id FROM bar WHERE code_id = ANY (?)`, pg.Array(params.Codes))
答案 1 :(得分:1)
您可以使用go-pg ORM来获得相同的结果:
ids := []int{1, 2, 3}
err := db.Model((*Book)(nil)).
Where("id in (?)", pg.In(ids)).
Select()
// SELECT * FROM books WHERE id IN (1, 2, 3)
答案 2 :(得分:0)
一种方法是使用创建字符串所需的定界符创建一个字符串,然后将其传递到db.query
以获取结果。
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
a := []int{7,45,32}
str := ConvertToString(a, ",")
query := `Select * from table1 where ID IN(`+ str +`)`
fmt.Println(query)
}
func ConvertToString(a []int, delim string) string{
var b string
for _, v := range a{
b += strconv.Itoa(v)
b += ","
}
return strings.Trim(b,",")
}
Playground上的工作代码。
已编辑:-
您可以根据需要使用Golang sqlx软件包。
database/sql
软件包不检查您的查询,它通过您的 参数直接传递给驱动程序,它使处理查询 IN子句很困难:
SELECT * FROM users WHERE level IN (?);
当这准备好作为后端的语句时,bindvar? 只对应一个参数,但是通常需要 是因为它是可变数量的参数,具体取决于 某个切片的长度,例如:
var levels = []int{4, 6, 7}
rows, err := db.Query("SELECT * FROM users WHERE level IN (?);", levels)
答案 3 :(得分:0)
您可以尝试执行以下操作:
// Slice with your integer IDs as strings.
ids := []string{}
// Convert integer ID to string ID.
for _, i := range []int{7, 45} {
ids = append(ids, strconv.Itoa(i))
}
现在您可以使用Join
函数,最终查询看起来将非常简单,就像这样:
in := strings.Join(ids, ",")
query := "SELECT id FROM bar WHERE code_id IN (" + in + ")"