从 Redshift 表中选择时使用 Postgres 数组的 Go 应用

标签 go amazon-redshift pq

我在网上看到了许多在从表中选择值时使用数组的示例。这是我针对 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/

相关文章:

amazon-web-services - 如果 S3 前缀不存在,Redshift COPY 命令会引发错误

postgresql - 尽管字符串是有效的 UTF8,但字节序列无效

go - 是否有相当于 "gcloud container clusters get-credentials"的 golang sdk

templates - Golang 新模板不起作用

macos - 删除了 golang 但 go 命令仍然有效?

sql - 当前时间戳 Redshift

go - 如何在 2d 游戏中处理全屏?

etl - Tableau 的版本控制

arrays - pq: 函数 unnest(unknown) 不是唯一的

postgresql - 从特定函数创建通用函数(重构)