Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment passer une tranche [] à une condition IN dans une instruction SQL préparée avec des conditions non IN également ?

Cependant, il existe une solution. Tout d'abord, puisque nous ne pouvons que avoir un seul paramètre qui explose et pas d'autres, nous devons d'abord rassembler nos paramètres dans un seul []slice :

var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
  params = append(params, SubTypes)
}

Étant donné que le SQL ne se développera pas de lui-même, développons cette boucle :

var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
  params = append(params, SubTypes)
  if inCondition != "" {
    inCondition += ", "
  }
  inCondition += "?"
}

En supposant des SubTypes contient []int{1,2,3} , inCondition devrait maintenant contenir ?, ?, ? .

Nous combinons ensuite cela à notre instruction SQL et explosons l'argument :

sqlstr := fmt.Sprintf(`SELECT *
  FROM foo
  WHERE type = ?
    AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)

Bien sûr, ce serait plutôt cool si vous pouviez simplement passer []slice s à vos relevés préparés, et le développé automatiquement. Mais cela peut donner des résultats inattendus si vous avez affaire à des données plus "inconnues".