sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo paso un [] segmento a una condición IN en una declaración SQL preparada con condiciones que no son IN también?

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'.