我在网上看到了许多在从表中选择值时使用数组的示例。这是我针对 Redshift 运行的查询。
从表中选择*,其中 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])`)
任何人都可以解释为什么我收到错误吗?
最佳答案
上面的内容应该适用于 Postgres,但 Redshift 不同,它没有数组数据类型。 Redshift 支持 ANY 条件,但不同的是,条件的参数应该是一组行,而不是数组:
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);
不会返回任何内容。
一组行可以是像上面那样的硬编码联合
,也可以是子查询的结果,但不能是逗号分隔的列表或数组。
关于从 Redshift 表中选择时使用 Postgres 数组的 Go 应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50174472/