在准备好的语句中查找 Postgres 查询,Golang

IN Lookup Postgres query in prepared statement, Golang

用例需要 运行 次排除查询。 类似于:

select col1 
from awesome_table 
where col2 not in (a,b,c,d) 
and col3 not in (a1,a2,a3,a4);

由于排除的 col1 值和排除的 col2 值的集合大小可变,生成预准备语句的好方法是什么? 我能想到的一个 hack 是定义集合的上限,比如 15,如果用户输入的查询集大小的数量小于最大值,则用重复值填充所有占位符,有没有更好的方法?根据社区的理念,准备好的陈述应该如何处理这个问题?

你能从 Go 传递 (Postgres) 数组吗?

然后你可以将语句重写为

where col2 <> ALL () 
  and col3 <> all ()

其中 </code> 和 <code> 是包含值的 (Postgres) 数组。

如果您不能传递正确的数组实例,您可以将值作为格式化的字符串传递,以便它可以转换为数组。

select col1 
from awesome_table 
where col2 <> ALL ( (cast  as int[]) ) 
  and col3 <> ALL ( (cast  as text[]) );

然后你可以传递 '{1,2,3}' 作为第一个参数,例如'{"foo", "bar"}' 作为第二个参数。您需要将数组类型调整为列的实际数据类型

添加到@a_horse_with_no_name的回答中, 在 Golang 中,psql 驱动程序 github.com/lib/pq 包含一个方法 Array(),可用于将 Golang 切片转换为 psql 数组。

...

import (
"github.com/lib/pq"
)

...

select col1 
from awesome_table 
where col2 <> ALL () 
  and col3 <> ALL ();


其中

slice1 := []string{val1, val2}
slice2 := []string{val3, val4}

pq.Array(slice1) 可以为 </code> 传递,<code>pq.Array(slice2) 可以为 </code> 占位符传递,同时传递预准备语句中的值。</p> <p>有关 <code>ANYALL 函数的更多信息,请访问 here