为了账号安全,请及时绑定邮箱和手机立即绑定

多列 IN/ANY postgres 查询

多列 IN/ANY postgres 查询

Go
POPMUISE 2022-10-17 15:51:01
示例表架构:create table t1(  col1 varchar(20),  col2 varchar(20));要求:获取与数组中存在的任何元组(col1,col2)匹配的行。SQL:select * from t1 where (col1, col2) in (('c11', 'c12'), ('c21', 'c22'));我想使用带有“github.com/lib/pq”驱动程序的“database/sql”包在Go中编写这个查询,这就是我面临的问题。我可以轻松地为单列 IN/ANY 查询执行此操作。例如,以下查询select * from t1 where col1 in ('c11', 'c21');可以通过以下代码片段来实现:args := []string{"c11", "c21}conn.Exec(`select * from t1 where col1 = any($1)`, pq.Array(args))但是,我不能对多列查询使用类似的方法。我尝试将 等作为参数传递pq.Array([][]string),pq.Array([]*pq.StringArray)但它们不起作用,并获取以下错误:input of anonymous composite types is not implemented将不胜感激任何帮助。
查看完整描述

1 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

您可以执行以下操作:


args := [][]string{{"c11","c21"},{"c21","c22"}}

params := make([]interface{}, len(args)*2)

tuples := make([]string, len(args))

for i := range args {

    params[i*2] = args[i][0]

    params[i*2+1] = args[i][1]

    tuples[i] = fmt.Sprintf("($%d,$%d)", i*2+1,i*2+2)

}

invals := "(" + strings.Join(tuples, ",")) + ")"

conn.Exec("SELECT * FROM t1 WHERE (col1,col2) IN " + invals, params...)

对于两列元组,您应该能够执行以下操作:


conn.Exec(`SELECT * FROM t1 WHERE (col1,col2) IN (

    SELECT * FROM json_each_text(json_object($1::text[]))

)`, pq.Array([][]string{{"c11","c21"},{"c21","c22"}}))


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信