Я хочу сделать IN %(param_name)s необязательно частью запроса PostgreSQL (деактевировать фильтр) если в качестве значения параметра был предоставлен пустой массив, получаем все значения, как если бы фильтра для
данного параметра не было. То есть выражение
"SELECT * FROM table_name WHERE cam_id IN %(param_name)s;"
будет тождественно
"SELECT * FROM table_name; "
Если возможных значений для param_name в Питоне мало, я могу обойти проблему передавая дефолтный список вместо пустого направленного а АПИ. Но я хочу узнать как это делать верно (без костылей).
Пример:
query ="""
SELECT
id, cam_id
FROM sometable
WHERE id > %(_id)s
// if use = instead of IN, it works well (of course if cameras is just one value, not array)
AND (%(camera)s is NULL OR cam_id IN %(camera)s);"""
values = {"_id": 10, camera: tuple(1, 2, 3)]}
curs.execute(query, values)
Какие я получаю ошибки если tuple пустой:
psycopg2.errors.SyntaxError: syntax error at or near ")" LINE 6: WHERE (() is NULL OR cam_id IN ()
Примечание, если заменить IN на = и передавать одиночные значения (не массив), то все отлично работает.
Ранее задавал вопрос
здесь