Sin embargo, hay una solución. En primer lugar, dado que podemos solo tiene un solo parámetro de explosión y ningún otro, primero debemos juntar nuestros parámetros en un solo []slice
:
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Dado que el SQL no se expandirá por sí solo, ampliemos ese ciclo:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
Asumiendo SubTypes
contiene []int{1,2,3}
, inCondition
ahora debería contener ?, ?, ?
.
Luego combinamos eso con nuestra instrucción SQL y explotamos el argumento:
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Por supuesto, sería genial si simplemente pudieras pasar []slice
s a sus declaraciones preparadas, y se expande automáticamente. Pero eso podría dar algunos resultados inesperados si se trata de más datos 'desconocidos'.