sql >> Database >  >> RDS >> Mysql

Hoe geef ik een []slice door aan een IN-voorwaarde in een voorbereide SQL-instructie met ook niet-IN-voorwaarden?

Er is echter een oplossing. Ten eerste, omdat we alleen een enkele exploderende parameter hebben en geen andere, moeten we eerst onze parameters samenvoegen in een enkele []slice :

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

Aangezien de SQL niet vanzelf uitbreidt, laten we die lus uitbreiden:

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

Uitgaande van SubTypes bevat []int{1,2,3} , inCondition moet nu ?, ?, ? . bevatten .

We combineren dat vervolgens met onze SQL-instructie en exploderen het argument:

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

Het zou natuurlijk best gaaf zijn als je gewoon []slice zou kunnen doorgeven s naar uw voorbereide verklaringen, en de automatisch uitgevouwen. Maar dat kan onverwachte resultaten opleveren als je te maken hebt met meer 'onbekende' gegevens.



  1. Hoe dubbele rijen negeren bij invoegen

  2. MySQL integer veld wordt geretourneerd als string in PHP

  3. MySQL-telling in dezelfde tabel inclusief nultellingswaarden

  4. SQL-database bijwerken met selectievakjes