Python Sqlite - Как выбрать, где Column1 ИЛИ Column2 равны значению в списке? - PullRequest
0 голосов
/ 10 октября 2019

У меня есть графический интерфейс, где пользователь может выбрать одно или несколько значений фильтра для запроса Sqlite.

На данный момент у меня есть этот запрос:

    sql="SELECT * FROM Product WHERE LatestChanges IS NOT 'Deleted' AND SubCategory IN ({seq})".format(seq=','.join(['?']*len(self.FilterValues)))

Теперь я хочу выбрать из Продукта, где Подкатегория ИЛИ Категория равна единице в моих значениях фильтра. Как мне это сделать?

А как мне предотвратить двойной выбор?

1 Ответ

1 голос
/ 11 октября 2019

Вот шаблон, который вам нужен для соответствия существующему условию:

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)))

Обратите внимание, что разделитель '),(' необходим для создания одного столбца литеральных значений. В противном случае только разделитель запятой будет интерпретирован как несколько значений в одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...