使用where in子句的mysql查询中的golang切片

Joh*_*rgo 8 go

我正在尝试运行如下查询,但只有第一个id值返回:-

select * from `table` where table`.`id` in ('1', '2', '3', '4', '5', '6', '7', '9', '11', '13', '14', '15', '17') and `table`.`deleted_at` is null
Run Code Online (Sandbox Code Playgroud)

我已经完成以下工作:

var aID = make([]string, 0)
var in india // india is struct

for rows.Next() {
    cook := rows.Scan(&in.ID)

    aID = append(aID, strconv.Itoa(in.ID))
}

asID = strings.Join(aID, ",")

anotherRow,err := db.Query("SELECT * from table2 where id in (?)", asID)
if err != nil { fmt.Printf("Error: ", err) }
// ... Other line follows up with "for anotherRow.Next() and fetching"
Run Code Online (Sandbox Code Playgroud)

在获取数据时,它仅返回值“ 1”,并且忽略与他一起传递的所有其他ID,即'2', '3', '4', '5', '6', '7', '9', '11', '13', '14', '15', '17'

如何正确通过?

我正在使用go-sql-driver/mysql

常问问题 :

  1. aID 确实包含所有这些数字作为字符串,并且

  2. table具有上面提供的所有可用行id

  3. table是从那里id被取出,并追加到aID与另一个记录id存储在aID被提取与in从声明table2

谢谢

Gav*_*vin 10

您可以执行以下操作:

args := make([]interface{}, len(asID))
for i, id := range asID {
    args[i] = id
}
stmt := `SELECT * from table2 where id in (?` + strings.Repeat(",?", len(args)-1) + `)`
anotherRow, err := db.Query(stmt, args...)
Run Code Online (Sandbox Code Playgroud)

请注意,如果asIDlen == 0,您将想设防。

如果要传递任何其他参数,则必须将它们添加到args切片中。

还要注意,您应该显式命名所需的列,这样可以保证您在正确的列中扫描到正确的字段。


Ale*_*mov 5

尝试

q,args,err := sqlx.In("SELECT * FROM table2 WHERE id IN(?);", asID) //creates the query string and arguments
rows, err := db.Query(q,args...)
Run Code Online (Sandbox Code Playgroud)

你也可以使用Masterminds/squirrel包:

import sq "github.com/Masterminds/squirrel"

...

users := sq.Select("*").From("table2")
active := users.Where(sq.Eq{"id":[]string{"1","2","3"}})
sql, args, err := active.ToSql()
Run Code Online (Sandbox Code Playgroud)

in clause当使用带有切片的 sq.Eq 结构时,这将自动执行。

  • @JohnCargo,您需要将“aID”设置为“[]interface{}”类型。为什么评论太长了。 (2认同)