我有一个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
喜欢,SubCategory IN ({seq})
则z
需要Category IN ({seq})
将列表两次插入字符串中。使用named格式参数将至少允许您重用列表字符串,但这是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)))
请注意,分隔符'),('
对于创建单列文字值是必需的。否则,只有逗号定界符将被解释为同一行中的多个值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句