Python SQL列表中两个值中的任意一个
所以我有一个值列表,我想检索某个日期后的所有条目,只要在值列表中可以找到两项中的任何一项- 我试过这样的方法:Python SQL列表中两个值中的任意一个,python,sql,sqlite,Python,Sql,Sqlite,所以我有一个值列表,我想检索某个日期后的所有条目,只要在值列表中可以找到两项中的任何一项- 我试过这样的方法: "SELECT * FROM table WHERE (date > ?) AND (item1 OR item2 IN (%s))" %(date, qForEach(len(my_list))) def qForEach(list_length): s = "?" for i in range((list_length - 1)):
"SELECT * FROM table WHERE (date > ?) AND (item1 OR item2 IN (%s))"
%(date, qForEach(len(my_list)))
def qForEach(list_length):
s = "?"
for i in range((list_length - 1)):
s += ",?"
return s
cursor.execute(statement, bindings)
但显然SQL认为我在问item1或item2,然后问它们中是否有一个在列表中。我还尝试了其他一些明显的变化,但似乎都没有达到预期的效果 您必须分别检查这两项 您必须确保所有参数(
?
)都传递给执行的第二个参数:
params=“,”.join([“?”表示范围内的i(len(my_列表)))
语句=“从MyTable中选择*”
日期>在哪里?
和((%s)中的项目1或(%s)中的项目2)(“”%(参数,参数)
绑定=[my_date]+my_列表+my_列表
execute(语句、绑定)
您可以使用以下方法避免重复绑定值:
params=“,”.join([“?”+str(i+2)表示范围内的i(len(my_列表)))
语句=“从MyTable中选择*”
日期>在哪里?
和((%s)中的项目1或(%s)中的项目2)(“”%(参数,参数)
绑定=[my_date]+my_列表
execute(语句、绑定)
取决于数据模式。如果填充了任何其他项列,则item1是否为null?我建议,在任何一种情况下,将该部分标准更改为((第1项在(%s))或(第2项在(%s)))我尝试过-它实际上不起作用-它们都不是空的。如果我将两者分开,我需要做什么(日期、qForEach(我的清单)、qForEach(我的清单))吗?还有bindings=my_list+my_list我对python方面不太熟悉,但仔细检查一下,您的%s是什么格式的?应该是“itemName1”,“ItemName2”,等等……是的,我知道了。其格式必须为:[日期]+我的清单+我的清单。另外,我认为使用两个不同的IN语句运行OR会降低效率?难道没有一种方法可以一起做吗?与什么相比效率会下降?在开始优化之前,您需要一个正确的查询。随着表与%s(我的列表)的比例越来越大,这不是变得越来越不高效吗?效率比什么低?它不是对表进行了两次分析吗?一次用于(我的列表)中的项1,一次用于(我的列表)中的项2?如果前面的逻辑是它实际执行的操作,则效率低于(my_列表)中的(item1或item2)。但是(my_列表)中的(item1或item2)
不起作用。如果查询不需要返回正确的结果,SELECT 42
将更加有效。我知道它不起作用,但它将是一种更有效的逻辑-因此我的问题是如何实现等效逻辑。