Golang中如何获取特定行中具有特定值的列名
Golang中如何获取特定行中具有特定值的列名 以下代码运行正常。但我想将数组[‘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 - lib/pq: Pure Go Postgres driver for database/sql编写以下代码:
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)
更多关于Golang中如何获取特定行中具有特定值的列名的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang中如何获取特定行中具有特定值的列名的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
问题在于PostgreSQL无法确定unnest($1)中参数的具体类型,导致"function unnest(unknown) is not unique"错误。需要使用类型转换来明确指定数组类型。
以下是修正后的代码:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
func main() {
db, err := sql.Open("postgres", "your-connection-string")
if err != nil {
log.Fatal(err)
}
defer db.Close()
arr1 := []string{"a", "b", "c", "d", "e"}
// 使用类型转换明确指定数组类型
query := `
SELECT colname
FROM (
SELECT date,
unnest($1::text[]) AS colname,
unnest($1::text[]) AS thing
FROM test1
WHERE date='123'
) AS tester
WHERE thing='1'`
rows, err := db.Query(query, pq.Array(arr1))
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var colname string
for rows.Next() {
err := rows.Scan(&colname)
if err != nil {
log.Fatal(err)
}
fmt.Println(colname)
}
if err = rows.Err(); err != nil {
log.Fatal(err)
}
}
关键修改是在SQL查询中使用$1::text[]进行类型转换,明确告诉PostgreSQL这是一个文本数组。这样PostgreSQL就能正确解析unnest函数调用。
对于你的表结构,由于列a-e是character varying(10)类型,你可能需要根据实际存储的值类型调整类型转换。如果存储的是数字值,可以使用$1::text[]或根据实际情况使用其他类型。

