Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como faço para passar uma fatia [] para uma condição IN em uma instrução SQL preparada com condições não IN também?


No entanto, existe uma solução. Em primeiro lugar, já que podemos somente tiver um único parâmetro de explosão e nenhum outro, devemos primeiro reunir nossos parâmetros em um único []slice :
var params []interface{}
params = append(params, Type)
for _, subtype := range SubTypes {
  params = append(params, SubTypes)
}

Como o SQL não expandirá sozinho, vamos expandir esse loop:
var params []interface{}
params = append(params, Type)
inCondition := ""
for _, subtype := range SubTypes {
  params = append(params, SubTypes)
  if inCondition != "" {
    inCondition += ", "
  }
  inCondition += "?"
}

Assumindo SubTypes contém []int{1,2,3} , inCondition agora deve conter ?, ?, ? .

Em seguida, combinamos isso com nossa instrução SQL e explodimos o argumento:
sqlstr := fmt.Sprintf(`SELECT *
  FROM foo
  WHERE type = ?
    AND subtype IN (%s)`, inCodition)
rows, err := sqldb.Query(sqlstr, params...)

Claro, seria muito legal, se você pudesse simplesmente passar []slice s para suas declarações preparadas e o expandido automaticamente. Mas isso pode dar alguns resultados inesperados se você estiver lidando com mais dados 'desconhecidos'.