示例表架構: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"}}))
- 1 回答
- 0 關注
- 228 瀏覽
添加回答
舉報
0/150
提交
取消