Mysql GO中的sql查询问题

Mysql GO中的sql查询问题,mysql,go,Mysql,Go,我有一个非常简单的mysql表,有3列,a、B和C A和B是钥匙 我有一个GO应用程序,我正在尝试从db检索数据。对于其他查询,效果很好,但对于此查询,效果不好: aParam := "aValue" bParam := "3,4,6,9" stmt, err := o.database.Prepare("SELECT * FROM tableX WHERE `A`= ? AND `B` IN ( ? )") defer stmt.Close() rows, err := stmt.Query(

我有一个非常简单的mysql表,有3列,a、B和C

A和B是钥匙

我有一个GO应用程序,我正在尝试从db检索数据。对于其他查询,效果很好,但对于此查询,效果不好:

aParam := "aValue"
bParam := "3,4,6,9"
stmt, err := o.database.Prepare("SELECT * FROM tableX WHERE `A`= ? AND `B` IN ( ? )")
defer stmt.Close()
rows, err := stmt.Query(aParam, bParam)
for rows.Next() {
...
}
如果我替换第二个?对于这些值,它工作得非常完美:

stmt, err := o.database.Prepare("SELECT * FROM tableX WHERE `A`= ? AND `B` IN ( 3,4,6,9 )")
我也尝试过这个(它不起作用):


有什么想法吗?

问题是单个
没有扩展到
SELECT
语句中(像字符串替换),而是作为单个字符串值
3,4,5,6

您需要展开子句中
的每个值,如下所示:

params := []interface{} { "aValue", 3, 4, 6, 9 }
stmt, err := o.database.Prepare("SELECT * FROM tableX WHERE `A`= ? AND `B` IN ( ?, ?, ?, ? )")
defer stmt.Close()
rows, err := stmt.Query(params...)

为了让您的生活更轻松,您可以使用这样的包,它更好地支持
查询中的参数化

您使用的是什么DB驱动程序?流行的Go DB驱动程序通常不太支持
查询中的
。另一个选项是填充临时表以保留“IN”列表,然后在查询中使用该表(联接或子查询)。通过这种方式,您就不会在处理不同大小的IN列表时受到太多限制。好的,这里还有一个问题:params:=[]接口{}{“aValue”,3,4,6,9}我需要动态添加这些值,我甚至不知道它们将超过多少。您需要为IN子句生成一个与您需要的ID数匹配的?'s字符串
params := []interface{} { "aValue", 3, 4, 6, 9 }
stmt, err := o.database.Prepare("SELECT * FROM tableX WHERE `A`= ? AND `B` IN ( ?, ?, ?, ? )")
defer stmt.Close()
rows, err := stmt.Query(params...)