Postgresql generate_series的Postgres查询中的占位符返回未知

Postgresql generate_series的Postgres查询中的占位符返回未知,postgresql,go,generate-series,Postgresql,Go,Generate Series,我尝试用这样的占位符进行查询 database.Query("select login,displayname from (select distinct $1+trunc(random()*$2)::integer as id from generate_series($3,$4) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id) 这给我带来了一个错误: pq: function generate

我尝试用这样的占位符进行查询

database.Query("select login,displayname from (select distinct $1+trunc(random()*$2)::integer as id from generate_series($3,$4) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
这给我带来了一个错误:

pq: function generate_series(unknown, unknown) is not unique
然后我找到了一个将查询格式化为字符串的解决方案

query:=fmt.Sprintf("select login,displayname from (select distinct %v+trunc(random()*%v)::integer as id from generate_series(%v,%v) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
它是有效的

我想让它以正确的方式工作,但我不明白为什么不能

更新:

var min_id int64
var max_id int64
err:=_database.QueryRow("select min(id),max(id) from users").Scan(&min_id, &max_id)
if err!=nil { 
    log.Panicf("Failed to get min and max %v",err.Error())
    return
}

var rows *sql.Rows

query:=fmt.Sprintf("select login,displayname from (select distinct %v+trunc(random()*%v)::integer as id from generate_series(%v,%v) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
log.Printf(query)
rows,err=_database.Query("select login,displayname from (select distinct $1+trunc(random()*$2)::integer as id from generate_series($3,$4) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
if err!=nil {
    log.Panicf("failed to get random entries: %v",err)
}

试着把你的问题分开。您将看到第一部分工作正常:

db.QueryRow("SELECT $1+trunc(random()*$2) as test", 10, 5)
这可能是因为
$1
$2
与数学运算符一起使用(和/或因为
trunc()
random()
都是返回数),因此postgres可以推断数据类型

因此,似乎是
generate_series()
参数未正确确定。Postgres可以根据参数推断数据类型,例如

if err := db.QueryRow("SELECT trunc($1,2) as test", 1.4343).Scan(&output); err != nil {panic(err)}
// output = 1.43
然而,如果它是一个多态函数,可能会出现歧义,并且会失败,例如

if err := db.QueryRow("SELECT trunc($1) as test", 1.4343).Scan(&output); err != nil {panic(err)}
// panic: pq: function trunc(unknown) is not unique

为了避免歧义,请在准备好的语句中显式强制转换参数,例如:
generate_series($3::int,$4::int)

max_id和min_id的类型是什么?它们是整数,并且有效。Go中有许多整数类型:int、uint、int64等。我的猜测是postgresql驱动程序不支持所有这些类型。尝试使用int64。没有帮助。我将用一个更详细的信息更新最初的帖子code@ekiyanov没问题!