Mysql
 sql >> Database >  >> RDS >> Mysql

Come faccio a passare una []fetta a una condizione IN in un'istruzione SQL preparata anche con condizioni non IN?

Comunque, c'è una soluzione. Innanzitutto, poiché possiamo solo hanno un singolo parametro di esplosione e nessun altro, dovremmo prima mettere insieme i nostri parametri in un unico []slice :

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

Poiché l'SQL non si espanderà da solo, espandiamo quel ciclo:

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

Assumendo SubTypes contiene []int{1,2,3} , inCondition ora dovrebbe contenere ?, ?, ? .

Quindi lo combiniamo alla nostra istruzione SQL ed esplodiamo l'argomento:

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

Certo, sarebbe fantastico se potessi semplicemente passare []slice s alle tue dichiarazioni preparate e automaticamente ampliato. Ma ciò potrebbe dare risultati inaspettati se hai a che fare con dati più "sconosciuti".