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[]或根据实际情况使用其他类型。

回到顶部