1

I try to query on list of userIDs. I am using the Go Pq library.

func ListUsers(userIDs []interface{}) (users []User, err error) {
    stm := `SELECT
    U.id,
    (
        CASE WHEN TRIM(UP.first_name || ' ' || UP.last_name) = '' THEN U.id :: TEXT ELSE UP.first_name || ' ' || UP.last_name END
        ) as avatar_name,
FROM
    users AS U
        JOIN user_profiles UP ON UP.user_id = U.id
WHERE
        U.id IN ($1);`

    rows, err := postgresql.Instance.Query(stm, userIDs)
    defer rows.Close()
    if err != nil && err != sql.ErrNoRows {
        return
    }

    if err == sql.ErrNoRows {
        return users, nil
    }

    for rows.Next() {
        var (
            id         int
            AvatarName string
        )
        err = rows.Scan(&id, &AvatarName)
        if err != nil {
            return nil, err
        }

        users = append(users, User{ID: id, AvatarName: AvatarName})
    }

    return users, nil
}

When I run this it gives error converting argument $1 type: unsupported type []interface {}, a slice of interface

Jonathan Hall
  • 75,165
  • 16
  • 143
  • 189
Idoncare
  • 15
  • 1
  • 1
  • 10

1 Answers1

4
  • Wrap the slice with pq.Array.
  • Change IN ($1) to = any($1) so the array value can be used.

Here's the code:

    stm := `SELECT
    U.id,
    (
        CASE WHEN TRIM(UP.first_name || ' ' || UP.last_name) = '' THEN U.id :: TEXT ELSE UP.first_name || ' ' || UP.last_name END
        ) as avatar_name,
FROM
    users AS U
        JOIN user_profiles UP ON UP.user_id = U.id
WHERE
        U.id = any($1);`
    rows, err := postgresql.Instance.Query(stm, pq.Array(userIDs))
Charlie Tumahai
  • 113,709
  • 12
  • 249
  • 242