Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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 Sqlite-如何选择列1或列2与列表中的值相等的位置?_Python_Sql_Python 3.x_Sqlite - Fatal编程技术网

Python Sqlite-如何选择列1或列2与列表中的值相等的位置?

Python Sqlite-如何选择列1或列2与列表中的值相等的位置?,python,sql,python-3.x,sqlite,Python,Sql,Python 3.x,Sqlite,我有一个GUI,用户可以在其中为Sqlite查询选择一个或多个筛选值 目前我有一个疑问: sql="SELECT * FROM Product WHERE LatestChanges IS NOT 'Deleted' AND SubCategory IN ({seq})".format(seq=','.join(['?']*len(self.FilterValues))) 现在,我想从产品中选择,其中子类别或类别在我的筛选值上等于一。我该怎么做 如何防止双重选择 以下是与现有条件相匹配

我有一个GUI,用户可以在其中为Sqlite查询选择一个或多个筛选值

目前我有一个疑问:

    sql="SELECT * FROM Product WHERE LatestChanges IS NOT 'Deleted' AND SubCategory IN ({seq})".format(seq=','.join(['?']*len(self.FilterValues)))
现在,我想从产品中选择,其中子类别或类别在我的筛选值上等于一。我该怎么做


如何防止双重选择

以下是与现有条件相匹配所需的模式:

x AND (y or z)
在一个基本条件表达式中,无法将两件事与同一个手动值列表进行比较-该列表需要指定两次。因此,如果y类似于{seq}中的子类别,那么z需要是{seq}中的类别,以便将列表插入字符串中两次。使用命名的format参数至少可以重用列表字符串,但这是python特性,不是sqlite 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)))

请注意,分隔符“,”是创建一列文字值所必需的。否则,只有逗号分隔符将被解释为同一行中的多个值。

只需向WHERE子句添加OR条件即可。您可以像在其他语言中一样构建逻辑条件,使用括号对复合条件进行分组,等等。看起来您已经理解了如何构建条件逻辑,所以这看起来相当简单。我遗漏了一些复杂性吗?关于双重选择的问题需要关于您的模式和数据示例的更多细节。否则,就只是猜测会复制什么和/或如何防止复制。WHERE条件本身不会双重选择任何内容。如果一行与OR语句的两个条件都匹配,那么整个条件就是TRUE。SELECT不会为WHERE条件的每个部分返回行。整个WHERE条件为真或假,多次不为真。当您使用联接或选择可以复制的有限字段时,会出现双重结果,但您选择了*。我掌握了基本知识,但由于对SQL相对较新,有时会有点结巴!谢谢你的解释!