sql >> Databasteknik >  >> RDS >> Mysql

Hur skickar jag ett []segment till ett IN-villkor i en förberedd SQL-sats med icke-IN-villkor också?

Det finns dock en lösning. Först och främst eftersom vi bara kan har en enda exploderande parameter och inga andra, bör vi först sätta ihop våra parametrar i en enda []slice :

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

Eftersom SQL inte kommer att expandera av sig själv, låt oss utöka den slingan:

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

Förutsatt SubTypes innehåller []int{1,2,3} , inCondition ska nu innehålla ?, ?, ? .

Vi kombinerar sedan det till vår SQL-sats och exploderar argumentet:

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

Naturligtvis skulle det vara ganska coolt om du bara kunde skicka []slice s till dina förberedda uttalanden, och den automatiskt utökade. Men det kan ge några oväntade resultat om du har att göra med mer "okända" data.



  1. Mysql-beräkning i select-satsen

  2. Jämföra SQL, frågebyggare och ORM

  3. Hur man skapar General Ledger/T-Account med PHP Mysql

  4. Java-program och mySQL-anslutningsproblem:Ingen lämplig drivrutin hittades