2

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

谁能解释我为什么会出错?

4

2 回答 2

2

以上内容应该适用于 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);

不会返回任何东西。

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

于 2018-05-04T12:59:34.313 回答
2

红移支持ANY('{1,2,3}'::integer[]). 不起作用的原因是,返回的
值是。然而 redshift 期望它是. 更改查询以包含 数组周围的单个括号不起作用。db.Query('select * from table where colID = ANY($1)', pq.Array([]int{1,2,3}))pq.Array([]int{1,2,3}){1,2,3}'{1,2,3}''' 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)
于 2018-05-07T06:04:27.000 回答