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

Hvordan sender jeg et []udsnit til en IN-betingelse i en forberedt SQL-sætning med ikke-IN-betingelser?

Der er dog en løsning. Først og fremmest, da vi kun kan har en enkelt eksploderende parameter og ingen andre, bør vi først sammensætte vores parametre i en enkelt []slice :

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

Da SQL'en ikke udvider sig af sig selv, lad os udvide denne løkke:

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

Forudsat SubTypes indeholder []int{1,2,3} , inCondition skal nu indeholde ?, ?, ? .

Vi kombinerer det derefter med vores SQL-sætning og eksploderer argumentet:

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

Det ville selvfølgelig være ret fedt, hvis du blot kunne sende []slice s til dine forberedte udsagn, og den automatisk udvidede. Men det kan måske give nogle uventede resultater, hvis du har at gøre med flere 'ukendte' data.



  1. Find alle ikke-numeriske værdier i en kolonne i Oracle

  2. Sådan importeres en SQL Server-database til Access 2016

  3. Tjek, om den aktuelle dato er mellem to datoer Oracle SQL

  4. Sådan gendannes en enkelt MySQL-tabel ved hjælp af mysqldump?