我使用的是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)发布于 2018-07-03 20:12:23
有几件事你可以做:
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))发布于 2020-01-04 21:55:48
您可以使用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)发布于 2018-07-03 14:01:04
一种方法是使用创建字符串所需的分隔符创建字符串,然后将其传递给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,",")
}游乐场上的工作代码。
编辑:-
您可以为您的需求使用戈朗广场包。
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)https://stackoverflow.com/questions/51156305
复制相似问题