PostgreSQL v11.13 (переход на более новую версию
НЕ предлагать),
Go v1.26.4,
github.com/jackc/pgx v5.10.0
github.com/jmoiron/sqlx v1.4.0
Задача: максимально просто выполнить параметризованный SELECT, выбирающий записи по заданному набору
пар значений столбцов. Что-то вроде такого:
SELECT * FROM tbl WHERE (field_1, field_2) = ANY(VALUES (1, 'a'), (2, 'b'), (3, 'c'))
, но с передачей среза кортежей в качестве параметра запроса.
Именно среза -
без дополнительных ручных преобразований данных в коде.
Работающий вариант есть:
SELECT * FROM tbl
WHERE (field_1, field_2) IN (SELECT p, k FROM JSONB_TO_RECORDSET($1) AS t(a BIGINT, b VARCHAR))
, но он требует ручного преобразования исходного среза в JSON:
type Key struct {
V1 int64 `db:"field_1" json:"a"`
V2 string `db:"field_2" json:"b"`
}
...
var keys []Key
...
req, err := json.Marshal(keys)
if err != nil {
return nil, err
}
rows, err := db.Queryx(sql, string(req))
Вопрос: как переписать запрос, чтобы можно было передавать в качестве параметра непосредственно значение типа []Key?