从 Redshift 选择时使用 Postgres 数组转到应用 table
Go app using Postgres array when selecting from Redshift table
我在网上看到很多使用数组从 table 中选择值的例子。这是我 运行 针对 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()`, 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])`)
任何人都可以解释为什么我会收到错误消息吗?
以上应该适用于 Postgres,但 Redshift 不同,它没有数组数据类型。 Redshift 支持任何条件,但以不同的方式,条件的参数应该是一组行,而不是数组:
select true where 1=any(select 1 union select 2 union select 3);
会returntrue
,
select true where 4=any(select 1 union select 2 union select 3);
return 什么都不会。
一组行可以是如上所述的硬编码 union
,或者是子查询的结果,但不能是逗号分隔的列表或数组。
Redshift 支持 ANY('{1,2,3}'::integer[])
.
db.Query('select * from table where colID = ANY()', pq.Array([]int{1,2,3}))
不起作用的原因是,pq.Array([]int{1,2,3})
返回的值是 {1,2,3}
。然而,redshift 期望它是 '{1,2,3}'
。更改查询以包含单个括号 ''
db.Query('select * from table where colID = ANY('')', pq.Array([]int{1,2,3}))
around 数组不起作用。
尝试了几个选项后,下面的代码成功了!
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)
我在网上看到很多使用数组从 table 中选择值的例子。这是我 运行 针对 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()`, 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])`)
任何人都可以解释为什么我会收到错误消息吗?
以上应该适用于 Postgres,但 Redshift 不同,它没有数组数据类型。 Redshift 支持任何条件,但以不同的方式,条件的参数应该是一组行,而不是数组:
select true where 1=any(select 1 union select 2 union select 3);
会returntrue
,
select true where 4=any(select 1 union select 2 union select 3);
return 什么都不会。
一组行可以是如上所述的硬编码 union
,或者是子查询的结果,但不能是逗号分隔的列表或数组。
Redshift 支持 ANY('{1,2,3}'::integer[])
.
db.Query('select * from table where colID = ANY()', pq.Array([]int{1,2,3}))
不起作用的原因是,pq.Array([]int{1,2,3})
返回的值是 {1,2,3}
。然而,redshift 期望它是 '{1,2,3}'
。更改查询以包含单个括号 ''
db.Query('select * from table where colID = ANY('')', pq.Array([]int{1,2,3}))
around 数组不起作用。
尝试了几个选项后,下面的代码成功了!
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)