Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQL列表中两个值中的任意一个_Python_Sql_Sqlite - Fatal编程技术网

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
将更加有效。我知道它不起作用,但它将是一种更有效的逻辑-因此我的问题是如何实现等效逻辑。