Вот шаблон, который вам нужен для соответствия существующему условию:
x AND (y or z)
Невозможно сравнить две вещи с одним и тем же списком значений вручную в базовом условном выражении - список должен бытьуказано дважды. Так что если y
похоже на SubCategory IN ({seq})
, то z
должно быть Category IN ({seq})
, чтобы список дважды вставлялся в строку. Использование именованного параметра формата по крайней мере позволит вам повторно использовать строку списка, но это функция Python, а не функция SQL SQL.
Существует другой подход SQL, но он, вероятно, только полезен (т.е. эффективнее?) если список очень длинный. В противном случае описанный выше подход, вероятно, является самым простым.
Вы можете указать именованное CTE (выражение общей таблицы), определяемое литеральным столбцом данных, а затем обратиться к тому же списку. (Я разбил строку на отдельные строки ниже для удобства чтения, но она неправильно отформатирована для python):
sql="
WITH categoryList AS (
SELECT * FROM ( VALUES ({seq}))
)
SELECT *
FROM Product
WHERE LatestChanges IS NOT 'Deleted'
AND (SubCategory IN categoryList OR Category IN categoryList)
".format(seq='),('.join(['?']*len(self.FilterValues)))
Обратите внимание, что разделитель '),('
необходим для создания одного столбца литеральных значений. В противном случае только разделитель запятой будет интерпретирован как несколько значений в одной строке.