Хранишь отдельно строку запроса и отдельно список значений.
Инициализируешь строку запроса
SELECT * FROM table WHERE (1 = 1)
- тогда у тебя будет корректный запрос и при наличии, и при отсутствии параметров.
Затем для каждого параметра проверяешь, если он был передан - к строке запроса добавляешь
f'AND ({paramname} = ?)'
(где paramname это имя параметра), а в список значений добавляешь в конце значение этого параметра. Если не передан - не делаешь ничего.
Тогда у тебя в конце будет строка вида
SELECT * FROM table WHERE (1 = 1) AND (b = ?) AND (c = ?)
, и к ней список значений, которые sqlite должна будет подставить вместо ?. Читай документацию на метод execute(), как это сделать.