Search code examples
mysqlsqlgogo-gormgolang-migrate

Is it possible to use SQL IIF function in GORM?


I have a a table for assignments, one for solutions and another for students. I want to retrieve all assignments and against each I want to add a 'flag' showing that the currently logged-in student has attempted the assignment or not.

I have tried this:

import (
   "fmt"    
   "gorm.io/gorm"
   "encoding/json"
   "github.com/my_organisation/myorg-repo/db"
)

var database *gorm.DB

var solutions []db.Solution
var listOfAsnmtIDs []uint

func myfuncn (w http.ResponseWriter, r *http.Request){
   //...
   _ = database.Table("solutions").Where("pupil_id = ?", 
   pupil.ID).Select("assignment_id").Find(&solutions)
    
    for _, solution := range solutions {
        listOfAsnmtIDs = append(listOfAsnmtIDs, solution.AssignmentID)
    }

response := database.Table("assignments").Select(`id, created_at, IIF((id IN ?), 'attempted', 'Not attempted') as attempted`, listOfAsnmtIDs).Find(&allAssignments)   

if response.RowsAffected < 1 {
   respondToClient(w, 404, nil, "No assignments found")
   return
 } 
//...
}

Solution

  • You just need to list params. Something like this

        var mad string
        for i, solution := range solutions {
            mad += strconv.FormatUint(uint64(solution.AssignmentID), 10)
            if i != len(solutions) {
                mad += ","
            }
            listOfAsnmtIDs = append(listOfAsnmtIDs, solution.AssignmentID)
        }
    
        response := database.Table("assignments").Select(`id, created_at, IIF((id IN ?), 'attempted', 'Not attempted') as attempted`, mad).Find(&allAssignments)