从Redshift表

时间:2018-05-04 12:01:41

标签: go amazon-redshift pq

我在网上看到很多使用数组的例子,同时从表中选择值。这是我针对Redshift运行的查询。 select * from table where colID = ANY(array[1]) 当我使用SQL Workbench运行它时,此查询正常工作。

我正在尝试使用https://github.com/lib/pq

在我的Go应用中运行相同的查询
db, err := sql.Open("postgres", url)
defer db.Close()

rows, err := db.Query(`select * from table where colID = ANY($1)`, pq.Array([]int{1}))
if nil != err {
        pqErr := err.(*pq.Error)
        fmt.Println(pqErr.Error())
} 

上述代码预计可以根据https://godoc.org/github.com/lib/pq#Array生效。

但是输出是错误的。

-----------------------------------------------
  error:  Assert
  code:      1000
  context:   IsA((Node*)arrayExpr->args->tail->data.ptr_value, Const) -
  query:     9574375
  location:  xen_execute.cpp:6200
  process:   padbmaster [pid=14680]
----------------------------------------------- 

因为错误和行是nil

但是以下代码可以使用

rows, err := db.Query(`select * from table where colID = ANY(array[1])`)

有人可以解释我收到错误的原因吗?

2 个答案:

答案 0 :(得分:2)

以上内容适用于Postgres,但Redshift不同,并且它没有数组数据类型。 Redshift支持任何条件,但以不同的方式,条件的参数应该是一组行,而不是数组:

select true where 1=any(select 1 union select 2 union select 3);

会返回true

select true where 4=any(select 1 union select 2 union select 3);

什么都不会返回。

一组行可以是上面的硬编码union,也可以是子查询的结果,但不是逗号分隔的列表或数组。

答案 1 :(得分:2)

Redshift支持ANY('{1,2,3}'::integer[]) db.Query('select * from table where colID = ANY($1)', pq.Array([]int{1,2,3}))无效的原因是因为pq.Array([]int{1,2,3})返回的值为{1,2,3}。但是,redshift期望它为'{1,2,3}'。更改查询以包含单个paranthesis '' db.Query('select * from table where colID = ANY('$1')', pq.Array([]int{1,2,3})) 数组周围不起作用。

尝试了几个选项后,下面的代码就可以了!

v, _ := pq.Array([]int{1,2,3}).Value()
query := fmt.Sprintf(`select * from table where colID = any('%v'::integer[]);`, v)
rows, err := db.Query(query)