PQ: 函数unnest(unknown)不唯一。

11
以下代码能够正常运行。但我希望将数组 array['a', 'b', 'c', 'd', 'e'] 定义为一个变量。
rows, err :=  db.Query("select colname from (SELECT date, unnest(array['a', 'b', 'c', 'd', 'e']) AS colname, unnest(array[a, b, c, d, e]) AS thing from test1 where date='123') as tester where thing=1;")

所以我试着使用github.com/lib/pq库来运行以下代码。

arr1 := []string{"a", "b", "c", "d", "e"}      
rows, err :=  db.Query("select colname from (SELECT date, unnest($1) AS colname, unnest($1) AS thing from test1 where date='123') as tester where thing=1;", pq.Array(arr1))

但是出现了"pq: function unnest(unknown) is not unique"的错误。 表结构和样例数据--
test=# \d+ test1
                                Table "public.test1"
 Column |         Type          | Modifiers | Storage  | Stats target | Description 
--------+-----------------------+-----------+----------+--------------+-------------
 a      | character varying(10) |           | extended |              | 
 b      | character varying(10) |           | extended |              | 
 c      | character varying(10) |           | extended |              | 
 d      | character varying(10) |           | extended |              | 
 e      | character varying(10) |           | extended |              | 
 date   | character varying(10) |           | extended |              | 

test=# select * from test1 ;
 a | b | c | d | e | date 
---+---+---+---+---+------
 3 | 1 | 3 | 2 | 3 | 124
 3 | 3 | 2 | 2 | 1 | 125
 1 | 2 | 2 | 1 | 3 | 126
 1 | 2 | 3 | 2 | 3 | 127
 1 | 1 | 2 | 2 | 3 | 123
(5 rows)

基本上,我想要在特定日期找到具有值“1”的列名(a、b、c、d或e)。

可能是PostgreSQL 9.3:函数不唯一错误的重复问题。 - Jonathan Hall
虽然不精通postgresql,但在c#中使用标准sql我会先创建一个字符数组,然后用逗号和空格分隔符将它们合并,在将其作为参数使用。 - Aleksa Ristic
PostgreSQL拥有数组类型(据我所知,这是标准SQL,尽管几乎没有人支持它们)。 - mu is too short
1个回答

23
我猜pq.Array返回的是PostgreSQL数组的字符串形式,这样你最终得到的结果可能像这样:
unnest('{a,b,c,d,e}')

由于PostgreSQL不确定如何解释该字符串,因此会出现对unnest(unknown)的投诉。您可以添加显式类型转换来澄清事情:

并且 PostgreSQL 不确定它应该如何解释那个字符串,因此会有 unnest(unknown) 的投诉。您应该能够添加一个明确的类型转换来澄清这些问题:

unnest($1::text[])         -- PostgreSQL-specific casting syntax
unnest(cast($1 as text[])) -- Standard casting syntax

你最终会得到类似这样的东西:

rows, err :=  db.Query("select colname from (SELECT date, unnest($1::text[]) AS colname, unnest($1) AS thing from test1 where date='123') as tester where thing=1;", pq.Array(arr1))

在第二个unnest中进行变量替换时出现了问题。当我使用以下代码时: rows,err:=db.Query(“select colname from(SELECT date,unnest($1 :: text [])AS colname,unnest(array [a,b,c,d,e])AS thing from test1 where date ='123')as tester where thing ='1';”,pq.Array(arr1)) 它会给出正确的输出。但是当使用以下代码时,我发现没有错误和输出。 rows,err:=db.Query(“select colname from(SELECT date,unnest($1 :: text [])AS colname,unnest($1)AS thing from test1 where date ='123')as tester where thing = 1;”,pq.Array(arr1)) - govind prajapati
如果您在 psql 中尝试此查询,会发生什么? - mu is too short
它会给出两个输出a和b。 - govind prajapati
你需要在问题中包含表结构和一些示例数据。 - mu is too short
更新了描述。 - govind prajapati
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接