ただし、解決策があります。まず第一に、私たちができるのは 爆発するパラメータが1つだけで、他にはない場合は、最初にパラメータを1つの[]slice
にまとめる必要があります。 :
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
params = append(params, SubTypes)
}
SQLはそれ自体では拡張されないため、そのループを拡張してみましょう。
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
params = append(params, SubTypes)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
SubTypes
を想定 []int{1,2,3}
が含まれています 、inCondition
?, ?, ?
が含まれている必要があります 。
次に、それをSQLステートメントに結合し、引数を展開します。
sqlstr := fmt.Sprintf(`SELECT *
FROM foo
WHERE type = ?
AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)
もちろん、[]slice
を渡すだけでかなりクールになります sを準備したステートメントに追加すると、自動的に展開されます。ただし、より多くの「不明な」データを処理している場合は、予期しない結果が生じる可能性があります。