sql >> Databáze >  >> RDS >> Mysql

Jak předám []slice IN-podmínce v připraveném SQL příkazu s non-IN-podmínkami?

Existuje však řešení. Za prvé, protože můžeme pouze mít jeden explodující parametr a žádné další, měli bychom nejprve dát dohromady naše parametry do jednoho []slice :

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

Protože se SQL nerozšíří samo o sobě, rozšiřme tuto smyčku:

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

Za předpokladu SubTypes obsahuje []int{1,2,3} , inCondition by nyní měl obsahovat ?, ?, ? .

Potom to zkombinujeme s naším příkazem SQL a rozložíme argument:

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

Samozřejmě by bylo skvělé, kdybyste mohli jednoduše předat []slice s na vaše připravené výpisy a automaticky se rozbalí. To však může přinést neočekávané výsledky, pokud pracujete s více „neznámými“ daty.



  1. PostgreSQL smaže veškerý obsah

  2. MYSQL:Kde je klauzule nejednoznačná

  3. Správa CDB Fleet v Oracle Database 18c

  4. Název tabulky nebo sloupce nemůže začínat číslicí?