Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie übergebe ich einen []Slice an eine IN-Bedingung in einer vorbereiteten SQL-Anweisung auch mit Nicht-IN-Bedingungen?

Es gibt jedoch eine Lösung. Erstens, weil wir nur können einen einzigen explodierenden Parameter haben und keine anderen, sollten wir zuerst unsere Parameter in einem einzigen []slice zusammenfassen :

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

Da die SQL nicht von selbst erweitert wird, erweitern wir diese Schleife:

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

Unter der Annahme von SubTypes enthält []int{1,2,3} , inCondition sollte jetzt ?, ?, ? enthalten .

Wir kombinieren das dann mit unserer SQL-Anweisung und explodieren das Argument:

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

Natürlich wäre es ziemlich cool, wenn Sie einfach []slice übergeben könnten s zu Ihren vorbereiteten Anweisungen und die automatisch erweitert. Dies kann jedoch zu unerwarteten Ergebnissen führen, wenn Sie es mit mehr „unbekannten“ Daten zu tun haben.