Jest jednak rozwiązanie. Po pierwsze, ponieważ możemy tylko mają jeden parametr exploding i żadnych innych, powinniśmy najpierw umieścić nasze parametry w jednym []slice
:
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
Ponieważ SQL nie rozwija się samoczynnie, rozwińmy tę pętlę:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
Zakładając SubTypes
zawiera []int{1,2,3}
, inCondition
powinien teraz zawierać ?, ?, ?
.
Następnie łączymy to z naszą instrukcją SQL i rozkładamy argument:
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
Oczywiście byłoby całkiem fajnie, gdybyś mógł po prostu przekazać []slice
s do przygotowanych zestawień i automatycznie rozwijanych. Ale może to dać nieoczekiwane wyniki, jeśli masz do czynienia z większą liczbą „nieznanych” danych.