Существует ли необязательный подготовленный оператор в SQL для различных конкретных уровней запросов - PullRequest
1 голос
/ 09 ноября 2019

Предположим, у меня есть запрос, который возвращает суммарные ежемесячные продажи отдельных продуктов в моей базе данных:

product = input("Enter product column to search")
milkOptions = input("Enter milkOptions column to search")
size = input("Enter size to search")

import sqlite3

conn=sqlite3.connect("system.db")
cur=conn.cursor()
sql ="""
select sum(quantity*price), strftime("%m-%Y", orderDate) 
as month 
from customerOrders
WHERE product = ? and milkOptions = ? and size = ?
group by orderDate"""

Есть ли способ запросить различные уровни специфичности, не создавая много похожих запросов. Например, если я введу Espresso для продукта, оставлю запись milkoptions и введу small for size, могу ли я вернуть все продажи Small Espresso. И наоборот, для пропуска и ввода других опций.

Вот моя база данных:

+---------+-----------+--------+-------------+------------+----------+-------+------------+
| orderid |  product  |  size  | milkOptions | orderDate  | quantity | price | customerid |
+---------+-----------+--------+-------------+------------+----------+-------+------------+
|       1 | Espresso  | Small  | Soya        | 2019-10-29 |        1 | 1.0   |        1   |
|       2 | Cappucino | Small  | SemiSkimmed | 2019-10-29 |        1 | 1.0   |        1   |
|       3 | Cappucino | Small  | SemiSkimmed | 2019-10-29 |        1 | 1.0   |        1   |
|       4 | Cappucino | Medium | SemiSkimmed | 2019-10-29 |        1 | 1.0   |        1   |
+---------+-----------+--------+-------------+------------+----------+-------+------------+

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Один из методов состоит в том, чтобы обусловить параметры - скажем, если вы намерены, чтобы значения NULL означали игнорирование этого:

where (product = ? or ? is null) and
      (milkOptions = ? or ? is null) and
      (size = ? or ? is null)

Предостережение заключается в том, что or обычно предотвращает использованиеиндекс. Таким образом, если у вас есть правильные индексы и вы хотите их использовать, то создание предложения where в виде строки на основе того, что доступно, является альтернативой.

0 голосов
/ 09 ноября 2019

Передайте дополнительный параметр флага 0 или 1 для каждого из столбцов, например:

WHERE 
  (product = ? OR 0 = ?)  
  AND 
  (milkOptions = ? OR 0 = ?) 
  AND 
  (size = ? OR 0 = ?)
  • Когда вы передаете 0 для параметра флага productчто-нибудь не равно NULL для столбца product) условие будет оцениваться как TRUE, что эквивалентно не заданию условия для столбца product.
  • Когда вы передаете 1 для параметра флага product и 'someproduct' для столбца product, тогда условие эквивалентно product = 'someproduct'.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...