簡體   English   中英

在准備好的語句中查找 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 值的集合是可變大小的,因此生成准備好的語句的好方法是什么? 我能想到的一個技巧是定義集合的上限,比如 15,如果用戶輸入的查詢集大小的數量小於最大值,則用重復的值填充所有占位符,有沒有更好的方法? 根據社區的哲學,准備好的聲明如何處理這個問題?

你能從 Go 傳遞 (Postgres) 數組嗎?

然后你可以將語句重寫為

where col2 <> ALL ($1) 
  and col3 <> all ($2)

其中$1$2是包含值的 (Postgres) 數組。

如果無法傳遞正確的數組實例,則可以將值作為格式化的字符串傳遞,以便將其轉換為數組。

select col1 
from awesome_table 
where col2 <> ALL ( (cast $1 as int[]) ) 
  and col3 <> ALL ( (cast $2 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 ($1) 
  and col3 <> ALL ($2);


在哪里

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

pq.Array(slice1)可以為$1傳遞, pq.Array(slice2)可以為$2占位符傳遞,同時在准備好的語句中傳遞值。

可以在 此處找到有關ANYALL函數的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM