前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang实现mysql where in查询

golang实现mysql where in查询

作者头像
素履coder
发布2022-02-17 14:20:26
2.1K0
发布2022-02-17 14:20:26
举报
文章被收录于专栏:素履coder

最近工作遇到一个小问题,即如何使用原生的sql查询where in语句,因为之前使用gorm习惯了,gorm已经封装好了,突然写原生的反而有点不熟悉,同时还要考虑到性能和代码是否繁琐,所以写这个笔记记录一下当时的几种解决方法。

场景

我传入in的范围是一个数组,里面值的类型为int64型,例如如下:

代码语言:javascript
复制
idSlice := []int{1, 2, 3, 4, 5, 6, 7}

正常的sql语句是这样写的:

代码语言:javascript
复制
select * from table where id in (1, 2, 3, 4, 5, 6, 7);

于是我想当然的也在代码这样写:

代码语言:javascript
复制
idSlice := []int{1, 2, 3, 4, 5, 6, 7}

query := fmt.Sprintf("select * from table where id in (?)", idSlice)
result, err := db.Query(query)

上面其实犯了两个错误,

  1. 即原生sql并不能识别(?),这在gorm可以是因为已经封装好了,所以经过多次试错和思考之后,反应过来,其实in的范围要写成字符串的形式,毕竟是把整条sql当成原生的查询语句,所以不能出现变量之类的东西,
  2. idSlice为数组类型,如果把(?)改成(%v),就会变成 in [1, 2, 3, 4, 5, 6, 7],同样不可以

所以我总结了几种方法去解决这些问题:

方法一

代码语言:javascript
复制
idSlice := []int{1, 2, 3, 4, 5, 6, 7}

var s []string
for i := 0; i < len(idSlice); i++ {
  s = append(s, strconv.Itoa(idSlice[i])) //把每个元素都变成string类型
}

var ss string
ss = strings.Join(s, "','")	//这里填入的s必须要为string类型的数组,所以前面要转换成string类型
//此时的ss为:1','2','3','4','5','6','7

query := fmt.Sprintf("select * from table where id in ('%s')", ss)
//组合之后:('1','2','3','4','5','6','7')
result, err := db.Query(query)

这种方法的问题在于使用了strings.Joins函数,而函数的第一个值必须为string类型的数值,所以需要用for循环进行一次转换,同时strings.Joins函数自己内部也有for循环,这里加起来就有两个for循环了,这样对整体的性能就有影响了。

方法二

代码语言:javascript
复制
idSlice := []int{1, 2, 3, 4, 5, 6, 7}

var ss string
for i := 0; i < len(idSlice); i++ {
  if i == 0 {
    s := fmt.Sprintf("'%d'", idSlice[i])
		ss += s
	} else {
		s := fmt.Sprintf(",'%d'", idSlice[i])
		ss += s
	}
}

query := fmt.Sprintf("select * from table where id in (%s)", ss)
result, err := db.Query(query)

这个方法的优点是没有使用strings.Joins函数,只用了一个for循环直接拼接,所以整体的性能是更优的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 场景
  • 方法一
  • 方法二
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档