猿问

多列 IN/ANY postgres 查询

示例表架构:


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

将不胜感激任何帮助。


POPMUISE
浏览 166回答 1
1回答

一只斗牛犬

您可以执行以下操作: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"}}))
随时随地看视频慕课网APP

相关分类

Go
我要回答