[英]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
占位符傳遞,同時在准備好的語句中傳遞值。
可以在 此處找到有關ANY
和ALL
函數的更多信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.