У вас есть как минимум два варианта: построить строку заполнителей и интерполировать их в запрос перед передачей параметров. Вместо использования IN
вы переключаетесь на ANY
вместе с lib/pq.Int64Array
* 1005.*.
Создание собственных заполнителей:
orderid := "44,33,55,66" // get input
ids := strings.Split(orderid, ",")
if len(ids) < 1 {
return // exit if no input
}
placeholders := ""
for i := range ids {
placeholders += ",$" + strconv.Itoa(i+1)
}
placeholders = placeholders[1:] // remove leading comma
query := `SELECT
rma_id,
order_id,
customer_id,
bin_id,
owner,
asin,
lpn,
warehouse_id
FROM crt.returns_in_inv
WHERE (warehouse_id IN (%[1]s) OR lower(warehouse_id) IN (%[1]s))
OR lpn IN (%[1]s)
OR asin IN (%[1]s)
OR rma_id IN (%[1]s)
OR customer_id IN (%[1]s)
OR ORDER_ID IN (%[1]s);`
query = fmt.Sprintf(query, placeholders) // inject placeholders $1,$2,$3,$4 into query template
rows, err := db.Query(query, ids...) // execute query
// ...
Использование ANY
:
orderid := "44,33,55,66" // get input
ids := strings.Split(orderid, ",")
if len(ids) < 1 {
return // exit if no input
}
params := make(pq.Int64Array, len(ids))
for i, s := range ids {
id, err := strconv.ParseInt(s, 10, 64)
if err != nil {
return // fail
}
params[i] = id
}
query := `SELECT
rma_id,
order_id,
customer_id,
bin_id,
owner,
asin,
lpn,
warehouse_id
FROM crt.returns_in_inv
WHERE (warehouse_id = ANY ($1) OR lower(warehouse_id) = ANY ($1))
OR lpn = ANY ($1)
OR asin = ANY ($1)
OR rma_id = ANY ($1)
OR customer_id = ANY ($1)
OR ORDER_ID IN = ANY ($1)`
rows, err := db.Query(query, params)
// ...